论文部分内容阅读
摘 要:相比Hibernate、iBatis、DBUtils等,理论上JDBC的性能都超过它们。JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的。在一些高性能的数据操作中,越高级的框架越不适合使用。本文对在开发中对JDBC使用过程中一些经验总结。
关键词:JDBC;数据库;经验
一、JDBC原理
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC定义了一组操作数据库的接口,不同的数据库厂商提供了JDBC接口的实现,这个实现称为JDBC驱动。这样就可以通过JDBC接口来对不同数据库获得统一的操作。
二、JDBC组成
JDBC有两部分组成:JDBC API和JDBC Driver Interface.
JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行.那么要把这些通用的API翻译成特定数据库能懂的“指令”,就要由JDBC Driver Interface来实现了;
JDBC Driver Interface:是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库。为了使客户端程序独立于特定数据库驱动程序,JDBC规范建议开发者使用接口编程方式,即尽量使应用依赖java.sql 及javax.sql中的接口和类.
三、JDBC操作数据库的一般步骤
1: 注册驱动类:Class.forName("com.mysql.jdbc.Driver");
2: 创建数据库连接 Connection conn = DriverManager.getConnection(dburl, user, password);
3: 创建执行SQL的对象:Statement stmt = conn.createStatement();
4: 执行SQL,并获取返回结果ResultSet rs = stmt.executeQuery(testsql);
5: 处理返回结果,此处打印查询结果while (rs.next()) { .... };
6: 关闭数据库连接:conn.close();
四、JDBC连接数据库的技巧——以Oracle数据库为例
1、驱动程序的选择。在客户机端软件的开发中,通过多次测试发现Thin驱动程序的性能都超过了OCI驱动程序所以我们选择Thin驱动程序。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯,可以获得最高的性能。
2、关闭自动提交功能,提高系统性能。为了提高系统的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,方法为:conn.setAutoCommit(false);由于关闭了自动提交功能,所以需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态SQL或有时间限制的命令中使用Statement对象。但实践中的测试表明,在有时间限制的SQL操作中,Statement对象可以使动态SQL命令的创建和执行变得更加简单。
4、利用helper函数对动态SQL命令进行格式化。在创建使用Statement对象执行的动态SQL命令时,一些格式化方面的问题需要处理,我们可以让helper方法。
5、利用PreparedStatement对象提高数据库的总体效率。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。
6、在成批处理重复的插入或更新操作中使用PreparedStatement对象。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。
7、使用Oracle locator方法插入、更新大对象(LOB)。Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。
8、使用SQL92语法调用存储过程。在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。 9、使用Object SQL将对象模式转移到数据库中。利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。
10、利用SQL完成数据库内的操作。我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。
五、JDBC使用经验
相比Hibernate、iBatis、DBUtils等,理论上JDBC的性能都超过它们。JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的。在一些高性能的数据操作中,越高级的框架越不适合使用。如何对JDBC访问进行优化呢:首先要选择纯Java的JDBC驱动。其次是使用连接池——使用一个“池”来管理JDBC连接,并精心调试池配置的参数,目前可用的数据库连接池很多很多。再次是配置好合适的参数,经过严格的测试后使用。最后要学会重用Connection——最大限度使用每个数据库连接,得到了就不要轻易“丢弃”。有时候在一个过程中,会多次操作数据库,而仅仅需要一个连接就够了,没必用一次就获取一个连接,用完后关闭或者入池。这样会增加“池”管理的成本,千万别以为你用了“池”就可以随便申请和归还连接,都是有代价的。如果是一个庞大循环块中操作数据库,更应该注意此问题!同时,我们要学会重用Statement——对于一些预定义SQL,设置为静态常量,并尽可能重用预定义SQL产生的PreparedStatement对象。对于多次使用一种模式的SQL,使用预定义,而且是批处理的SQL可以获取更好的性能。查询时候优化结果集ResultSet,返回的结果集有不同的类型,优先选择只读结果集、不可滚动的属性。
参考文献
[1] 朱喜福,林建民,唐永新.JAVA程序设计[M].北京:人民邮电出版社,2001.
[2] [美]泰勒,李东升等译,JDBC数据库编程与J2EE[M].北京:电子工业出版社,2008.
[3] 宋善德,郭飞.基于Java的Web数据库连接池技术的研究[J]计算机工程与应用,2008:38(8)201-203
作者简介:
樊华(1983-),男,本科,张家界航空工业职业技术学院,研究方向:计算机应用。
关键词:JDBC;数据库;经验
一、JDBC原理
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC定义了一组操作数据库的接口,不同的数据库厂商提供了JDBC接口的实现,这个实现称为JDBC驱动。这样就可以通过JDBC接口来对不同数据库获得统一的操作。
二、JDBC组成
JDBC有两部分组成:JDBC API和JDBC Driver Interface.
JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行.那么要把这些通用的API翻译成特定数据库能懂的“指令”,就要由JDBC Driver Interface来实现了;
JDBC Driver Interface:是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库。为了使客户端程序独立于特定数据库驱动程序,JDBC规范建议开发者使用接口编程方式,即尽量使应用依赖java.sql 及javax.sql中的接口和类.
三、JDBC操作数据库的一般步骤
1: 注册驱动类:Class.forName("com.mysql.jdbc.Driver");
2: 创建数据库连接 Connection conn = DriverManager.getConnection(dburl, user, password);
3: 创建执行SQL的对象:Statement stmt = conn.createStatement();
4: 执行SQL,并获取返回结果ResultSet rs = stmt.executeQuery(testsql);
5: 处理返回结果,此处打印查询结果while (rs.next()) { .... };
6: 关闭数据库连接:conn.close();
四、JDBC连接数据库的技巧——以Oracle数据库为例
1、驱动程序的选择。在客户机端软件的开发中,通过多次测试发现Thin驱动程序的性能都超过了OCI驱动程序所以我们选择Thin驱动程序。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯,可以获得最高的性能。
2、关闭自动提交功能,提高系统性能。为了提高系统的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,方法为:conn.setAutoCommit(false);由于关闭了自动提交功能,所以需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态SQL或有时间限制的命令中使用Statement对象。但实践中的测试表明,在有时间限制的SQL操作中,Statement对象可以使动态SQL命令的创建和执行变得更加简单。
4、利用helper函数对动态SQL命令进行格式化。在创建使用Statement对象执行的动态SQL命令时,一些格式化方面的问题需要处理,我们可以让helper方法。
5、利用PreparedStatement对象提高数据库的总体效率。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。
6、在成批处理重复的插入或更新操作中使用PreparedStatement对象。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。
7、使用Oracle locator方法插入、更新大对象(LOB)。Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。
8、使用SQL92语法调用存储过程。在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。 9、使用Object SQL将对象模式转移到数据库中。利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。
10、利用SQL完成数据库内的操作。我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。
五、JDBC使用经验
相比Hibernate、iBatis、DBUtils等,理论上JDBC的性能都超过它们。JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的。在一些高性能的数据操作中,越高级的框架越不适合使用。如何对JDBC访问进行优化呢:首先要选择纯Java的JDBC驱动。其次是使用连接池——使用一个“池”来管理JDBC连接,并精心调试池配置的参数,目前可用的数据库连接池很多很多。再次是配置好合适的参数,经过严格的测试后使用。最后要学会重用Connection——最大限度使用每个数据库连接,得到了就不要轻易“丢弃”。有时候在一个过程中,会多次操作数据库,而仅仅需要一个连接就够了,没必用一次就获取一个连接,用完后关闭或者入池。这样会增加“池”管理的成本,千万别以为你用了“池”就可以随便申请和归还连接,都是有代价的。如果是一个庞大循环块中操作数据库,更应该注意此问题!同时,我们要学会重用Statement——对于一些预定义SQL,设置为静态常量,并尽可能重用预定义SQL产生的PreparedStatement对象。对于多次使用一种模式的SQL,使用预定义,而且是批处理的SQL可以获取更好的性能。查询时候优化结果集ResultSet,返回的结果集有不同的类型,优先选择只读结果集、不可滚动的属性。
参考文献
[1] 朱喜福,林建民,唐永新.JAVA程序设计[M].北京:人民邮电出版社,2001.
[2] [美]泰勒,李东升等译,JDBC数据库编程与J2EE[M].北京:电子工业出版社,2008.
[3] 宋善德,郭飞.基于Java的Web数据库连接池技术的研究[J]计算机工程与应用,2008:38(8)201-203
作者简介:
樊华(1983-),男,本科,张家界航空工业职业技术学院,研究方向:计算机应用。