经过JDBC毗邻oracle数据库的十年夜才干
来源:天极网
Java数据库毗邻(JDBC)API是一系列可以让Java编程职员会晤数据库的接口,各个拓荒商的接口并不完全相反。在运用多年的Oracle公司的JDBC后,我积累了很多才干,这些才干可以使我们更好地发扬体系的性能和完成更多的服从。
1、在客户端软件拓荒中运用Thin驱动按次
在拓荒Java软件方面,Oracle的数据库提供了四品种型的驱动按次,二种用于使用软件、applets、servlets等客户端软件,其它二种用于数据库中的Java存储进程等效力器端软件。在客户机端软件的拓荒中,我们可以选择OCI驱动按次或Thin驱动按次。OCI驱动按次操纵Java外埠化接口(JNI),经过Oracle客户端软件与数据库举办通信。Thin驱动按次是纯Java驱动按次,它间接与数据库举办通信。为了得到最高的性能,Oracle发起在客户端软件的拓荒中运用OCI驱动按次,这彷佛是切确的。但我发起运用Thin驱动按次,由于经过屡次测试发现,在常常情形下,Thin驱动按次的性能都超越了OCI驱动按次。
2、关闭主动提交服从,前进体系性能
在第一次创立与数据库的毗邻时,在缺省情形下,毗邻是在主动提友谊势下的。为了得到更好的性能,可以经过挪用带布尔值false参数的Connection类的setAutoCommit()要领关闭主动提交服从,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦关闭了主动提交服从,我们就需求经过挪用Connection类的commit()和rollback()要领来人工的要领对事件举办管理。
3、在静态SQL或有工夫限制的饬令中运用Statement对象
在尝试SQL饬令时,我们有二种选择:可以运用PreparedStatement对象,也可以运用Statement对象。无论几屡次地运用一致个SQL饬令,PreparedStatement都只对它剖析和编译一次。当运用Statement对象时,每次尝试一个SQL饬令时,都市对它举办剖析和编译。这年夜约会使你认为,运用PreparedStatement对象比运用Statement对象的速度更快。可是,我举办的测试诠释,在客户端软件中,情形并非云云。是以,在有工夫限制的SQL操纵中,除非成批地措置SQL饬令,我们该当思索运用Statement对象。
别的,运用Statement对象也使得编写静态SQL饬令愈加庞大,由于我们可以将字符串毗邻在一同,创立一个有效的SQL饬令。是以,我认为,Statement对象可以使静态SQL饬令的创立和尝试变得愈加庞大。
4、操纵helper函数对静态SQL饬令举办技俩化
在创立运用Statement对象尝试的静态SQL饬令时,我们需求措置一些技俩化方面的标题问题。例如,假设我们想创立一个将名字O'Reilly拔出表中的SQL饬令,则必须运用二个相连的“''”号互换O'Reilly中的“'”号。完成这些事故的最好的要领是创立一个完成互换操纵的helper要领,然后在毗邻字符串心折用公式表达一个SQL饬令时,运用创立的helper要领。与此类似的是,我们可以让helper要领继承一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。
5、操纵PreparedStatement对象前进数据库的总体服从
在运用PreparedStatement对象尝试SQL饬令时,饬令被数据库举办剖析和编译,然后被放到饬令缓冲区。然后,每当尝试一致个PreparedStatement对象时,它就会被再剖析一次,但不会被再次编译。在缓冲区中可以发现预编译的饬令,而且可以从头运用。在有年夜批用户的企业级使用软件中,经常会重复尝试相反的SQL饬令,运用PreparedStatement对象带来的编译次数的增添可以前进数据库的总体性能。假设不是在客户端创立、筹备、尝试PreparedStatement义务需求的工夫善于Statement义务,我会发起在除静态SQL饬令之外的所有情形下运用PreparedStatement对象。
6、在成批措置重复的拔出或更新操纵中运用PreparedStatement对象
假设成批地措置拔出和更新操纵,就可以显着地增添它们所需求的工夫。Oracle提供的Statement和CallableStatement并不真正地支撑批措置,只要PreparedStatement对象才真正地支撑批措置。我们可以运用addBatch()和executeBatch()要领选择尺度的JDBC批措置,年夜概经过操纵PreparedStatement对象的setExecuteBatch()要领和尺度的executeUpdate()要领选择速度更快的Oracle专有的要领。要运用Oracle专有的批措置机制,可以以如下所示的要领挪用setExecuteBatch():
PreparedStatementpstmt3Dnull;
try{
((OraclePreparedStatement)pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
挪用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会主动地引发SQL饬令尝试,尺度的executeUpdate()要领就会被作为批措置送到数据库中。我们可以经过挪用PreparedStatement类的sendBatch()要领随时传输批措置义务。
7、运用Oraclelocator要领拔出、更新年夜对象(LOB)
Oracle的PreparedStatement类不完全支撑BLOB和CLOB等年夜对象的措置,尤其是Thin驱动按次不支撑操纵PreparedStatement对象的setObject()和setBinaryStream()要领设置BLOB的值,也不支撑操纵setCharacterStream()要领设置CLOB的值。只要locator自己中的要领才可以从数据库中获取LOB范例的值。可以运用PreparedStatement对象拔出或更新LOB,但需求运用locator才调获取LOB的值。由于存在这二个标题问题,是以,我发起运用locator的要领来拔出、更新或获取LOB的值。
8、运用SQL92语法挪用存储进程
在挪用存储进程时,我们可以运用SQL92或OraclePL/SQL,由于运用OraclePL/SQL并没有什么抱负的所长,而且会给予后维护你的使用按次的拓荒职员带来费事,是以,我发起在挪用存储进程时运用SQL92。
9、运用ObjectSQL将对象方式转移到数据库中
既然可以将Oracle的数据库作为一种面向对象的数据库来运用,就可以思索将使用按次中的面向对象方式转到数据库中。此刻的要领是创立Javabean作为假装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加要领。固然如许作在Java中没有什么标题问题,但由于操纵都是在数据库之外举办的,是以其他会晤数据库的使用软件无法操纵对象方式。假设操纵Oracle的面向对象的技能,可以经过创立一个新的数据库对象范例在数据库中仿照其数据和操纵,然后运用JPublisher等对象生成自己的Javabean类。假设运用这种要领,不单Java使用按次可以运用使用软件的对象方式,其他需求共享你的使用中的数据和操纵的使用软件也可以运用使用软件中的对象方式。
10、操纵SQL完成数据库内的操纵
我要向年夜家引见的最紧张的履历是充沛操纵SQL的面向集合的要领来办理数据库措置需求,而不是运用Java等进程化的编程语言。
假设编程职员要在一个表中查找很多行,结果中的每个行都市查找其他表中的数据,末了,编程职员创立了独立的UPDATE饬令来成批地更新第一个表中的数据。与此类似的义务可以经过在set子句中运用多列子盘查而在一个UPDATE饬令中完成。当可以在单一的SQL饬令中完成义务,何需要让数据在网下贱来流去的?我发起用户过细学习如何最年夜限制地发扬SQL的服从。
版权声明:
原创作品,允许转载,转载时请务必以超链接方式标明文章 原始情由 、作者信息和本声明。否则将追究法律责任。