Java数据库链接(JDBC)API是一系列可以让Java编程人员访问数据库的接口,各个开发商的接口并不彻底相同。在使用多年的Oracle公司的JDBC后,我积累了许多技巧,这些技巧可以使咱们更好地发挥系统的性能和实现更多的功能。数据库
一、在客户端软件开发中使用Thin驱动程序编程
在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,咱们能够选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),经过Oracle客户端软件与数据库进行通信。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通信。为了得到最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这彷佛是正确的。但我建议使用Thin驱动程序,由于经过屡次测试发现,在一般状况下,Thin驱动程序的性能都超过了OCI驱动程序。服务器
二、关闭自动提交功能,提升系统性能app
在第一次创建与数据库的链接时,在缺省状况下,链接是在自动提交模式下的。为了得到更好的性能,能够经过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,以下所示:编程语言
conn.setAutoCommit(false);函数
值得注意的是,一旦关闭了自动提交功能,咱们就须要经过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。工具
三、在动态SQL或有时间限制的命令中使用Statement对象性能
在执行SQL命令时,咱们有二种选择:可使用PreparedStatement对象,也可使用Statement对象。不管多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试代表,在客户端软件中,状况并不是如此。所以,在有时间限制的SQL操做中,除非成批地处理SQL命令,咱们应当考虑使用Statement对象。学习
此外,使用Statement对象也使得编写动态SQL命令更加简单,由于咱们能够将字符串链接在一块儿,创建一个有效的SQL命令。所以,我认为,Statement对象可使动态SQL命令的建立和执行变得更加简单。测试
四、利用helper函数对动态SQL命令进行格式化
在建立使用Statement对象执行的动态SQL命令时,咱们须要处理一些格式化方面的问题。例如,若是咱们想建立一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工做的最好的方法是建立一个完成替换操做的helper方法,而后在链接字符串心服用公式表达一个SQL命令时,使用建立的helper方法。与此相似的是,咱们可让helper方法接受一个Date型的值,而后让它输出基于Oracle的to_date()函数的字符串表达式。
五、利用PreparedStatement对象提升数据库的整体效率
在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,而后被放到命令缓冲区。而后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中能够发现预编译的命令,而且能够从新使用。在有大量用户的企业级应用软件中,常常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减小可以提升数据库的整体性能。若是不是在客户端建立、预备、执行PreparedStatement任务须要的时间长于Statement任务,我会建议在除动态SQL命令以外的全部状况下使用PreparedStatement对象。
六、在成批处理重复的插入或更新操做中使用PreparedStatement对象
若是成批地处理插入和更新操做,就可以显著地减小它们所须要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。咱们可使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者经过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,能够以以下所示的方式调用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引起SQL命令执行,标准的executeUpdate()方法就会被做为批处理送到数据库中。咱们能够经过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。
七、使用Oracle locator方法插入、更新大对象(LOB)
Oracle的PreparedStatement类不彻底支持BLOB和CLOB等大对象的处理,尤为是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator自己中的方法才可以从数据库中获取LOB类型的值。可使用PreparedStatement对象插入或更新LOB,但须要使用locator才能获取LOB的值。因为存在这二个问题,所以,我建议使用locator的方法来插入、更新或获取LOB的值。
八、使用SQL92语法调用存储过程
在调用存储过程时,咱们可使用SQL92或Oracle PL/SQL,因为使用Oracle PL/SQL并无什么实际的好处,并且会给之后维护你的应用程序的开发人员带来麻烦,所以,我建议在调用存储过程时使用SQL92。
九、使用Object SQL将对象模式转移到数据库中
既然能够将Oracle的数据库做为一种面向对象的数据库来使用,就能够考虑将应用程序中的面向对象模式转到数据库中。目前的方法是建立Java bean做为假装的数据库对象,将它们的属性映射到关系表中,而后在这些bean中添加方法。尽管这样做在Java中没有什么问题,但因为操做都是在数据库以外进行的,所以其余访问数据库的应用软件没法利用对象模式。若是利用Oracle的面向对象的技术,能够经过建立一个新的数据库对象类型在数据库中模仿其数据和操做,而后使用JPublisher等工具生成本身的Java bean类。若是使用这种方式,不但Java应用程序可使用应用软件的对象模式,其余须要共享你的应用中的数据和操做的应用软件也可使用应用软件中的对象模式。
十、利用SQL完成数据库内的操做
我要向你们介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。
若是编程人员要在一个表中查找许多行,结果中的每一个行都会查找其余表中的数据,最后,编程人员建立了独立的UPDATE命令来成批地更新第一个表中的数据。与此相似的任务能够经过在set子句中使用多列子查询而在一个UPDATE命令中完成。当可以在单一的SQL命令中完成任务,何须要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。