文|戴长秀
提高Java访问数据库效率的方法研究与探讨
文|戴长秀
随着“互联网+”时代的到来,互联网应用已深入各行各业,电子商务发展态势尤为突出。信息技术和网络技术发展迅速,导致信息量和数据量猛增,怎样才能使管理信息和数据的信息系统高效、稳定的运行,其中最重要的措施就是要保证对数据库的高效访问。然而,随着数据规模的增大,对数据库的访问压力也越来越大,一般的数据库技术已不能满足快速、高效地读取服务器中的数据库要求。当下,Java技术是用于网络中较为流行的一门技术,Java技术最突出的特点就是跨平台性,用Java编写的代码可移植性较好。在数据库操作中,因为JDBC同样是独立于平台的,所以使用Java API提供的JDBC来连接数据库时,就不用担心平台变更时的代码移植问题。Java技术与JDBC的完善结合,使得Java技术应用越来越广泛,从而也使得Java访问数据库的优化技术逐渐备受关注。如何合理的进行数据库设计与管理,如何对数据库查询优化,如何在数据库访问的编程上优化等成为本文探讨的问题。
在进行数据库访问时,数据库的结构设计很重要,结构不合理将直接影响到对数据库的访问速度、稳定等性能。
(一)表结构设计
数据库的设计实质就是设计一个数据库结构的过程,其主要任务就是设计数据模式,一个良好的数据库模式应具有最小的数据冗余,在一定范围内实现数据共享特性,通常数据模式设计完毕是不轻易改动的,因为它既是应用程序存取数据,处理数据的依据,同时也是实现数据物理存储的依据,因此数据模式设计的优劣严重影响到数据库的访问性能。在设计数据模式时尽量满足3NF,一个关系模式中每个非主属性都完全依赖于关键字,关系模式之间不存在传递依赖,关键字段尽量使用单一属性,不使用复合属性,属性选择合理,避免数据删除、插入操作等异常现象发生。
(二)数据库类型选择
数据库类型繁多,有简单易操作的Excel,有面向中小型应用的Visual Foxpro、Access、My SQL、 SQL Server、DB2,有面向大型应用的Oracle等。从简单易操作来考虑,首选Excel、Access、SQL Server,从开放性角度考虑,首选Oracle,Oracle完全支持所有的工业标准,采用完全开放策略,完全向下兼容,没有风险,但是Oracle操作复杂。因此,对于一般的中小型应用系统,应尽量考虑应用场合,使用人员水平等,遵循不勿高,不勿优原则。
(一)优化查询语句
在进行数据库查询操作时,如果SQL查询语句设计不合理,也会影响到数据库的访问效率,因此需要对SQL查询语句进行优化。通过尽可能的减少SQL查询语句的运行时间,尽可能的少用联表查询,在SQL查询语句的where子语句中慎用in和not in,避免在where子语句中进行函数操作,优化where子语句中的条件顺序等方式来加快数据库的查询速度。
(二)建立索引
SQL查询语言在索引技术支持下才能够提高操作效率,索引会按我们要查询的列进行逻辑排序,尽量不使用复合索引,为了加快查询速度尽量使用聚簇索引,该索引不额外增加存储空间。通过索引的建立,加快数据的检索、显示、查询等操作的速度。
通过SQL语句,可以实现数据库的增、删、改、查操作。但是,应用程序中的SQL语句如何传到数据库中执行,数据库的执行结果如何返回到应用程序中,该问题的解决方案就是在应用程序和数据库之间必须建立一条通道,这条通道提供SQL语句的发送和执行结果的返回。建立通道的方式有ODBC开放式数据库连接和JDBC数据库连接应用程序接口。JDBC是Java DataBase Connectivity的简称,是一种可执行SQL语句并可返回结果的Java 应用程序接口,它描述了如何使用SQL去连接数据源。JDBC制定了统一的访问各类关系数据库的标准接口,虽然在具体的使用过程中,往往由于数据库的不同,需要修改数据库的连接代码,但是JDBC最大的特点就是独立于具体的关系数据库,即与数据库的无关性。使用JDBC访问数据库多有以下两种结构,要通过JDBC来存取某一特定的数据库,必须有相应的JDBC驱动,选择何种驱动方式对数据库的访问性能有很大影响。
(一)JDBC-ODBC桥和ODBC驱动模式
ODBC是Open DataBase Connectivity的简称,是由Microsoft公司提供的应用程序接口,它负责连接各种不同产商和类型的关系型数据库系统,为各种不同的编程语言提供查询、插入、修改和删除数据的功能,如同在各种不同的DBMS和各种不同的编程语言之间架设了一座通用的桥梁。虽然不同的数据库,连接方式是不同的,就像安装不同品牌的打印机需要安装相应的驱动程序才能正常工作一样。但是ODBC类似于数据库的万能驱动,可以和多种数据库连接,如Access,dBase,SQL Server,Oracle等。但是JAVA应用程序无法和ODBC直接连接,于是原SUN公司提供JDBC-ODBC桥驱动类,完成JAVA应用程序和ODBC的连接。JDBC-ODBC桥驱动模式一般用来存取Microsoft Access数据库、Visual FoxPro数据库等,此驱动程序适合于开发小规模的应用程序。虽然JDBC-ODBC桥提供了非常方便的免费连接驱动,但在连接时要进行一些不必须的转换,而影响了数据库操作效率,在大量的数据操作的情况下,JDBCODBC桥驱动无法满足查询速度的需要,另外,由于JDBCODBC桥驱动不是纯JAVA驱动,影响程序的跨平台执行,因此该驱动方式一般适用于测试,不作为软件产品的代码。
(二)纯JAVA的JDBC驱动程序
为了解决JDBC-ODBC桥驱动的弊端,在JAVA数据库编程中通常采用JDBC直连的方式访问数据库,数据库厂商提供纯JAVA的JDBC驱动程序,开发者在应用程序中只需通过调用JDBC API建立应用程序到数据库的连接即可。该模式的优点是驱动由数据库厂商提供,匹配性能更好,无需ODBC转发,执行效率高。由于JDBC驱动是数据库厂商提供的,因此在数据库编程中,用到何种数据库就需要在应用程序中添加相应的驱动程序包。以SQL 2008数据库为例,连接SQL 2008数据库需要用到的包有sqljdbc.jar或sqljdbc4. jar。连接SQL 2008数据库时加载驱动的代码为:Class. forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");建立连接的URL代码为:
String url=”jdbc:sqlserver:// localhost:1433;databasename=数据源名”;
通常,如果是在实验性的环境下,则以JDBC-ODBC桥和ODBC驱动模式最为常用,在小型应用中多以纯JAVA的JDBC驱动程序模式访问数据库。无论是哪一种驱动模式,JDBC主要完成以下四方面的工作:①加载JDBC驱动程序;②建立与数据库的连接;③使用SQL语句进行数据库操作并处理结果;④关闭相关连接。
JDBC连接数据库之后就可以对数据库表进行操作了,使用编程技术即可实现数据库表记录的增、删、改等操作,但是不同的程序代码对数据库表的操作效率不一样,有必要对数据库访问编程优化。
(一)使用预处理
Java.sql包中有个重要接口Statement,Statement用于执行静态 SQL 语句并返回所生成结果的对象。例如ResultSet rst=stmt. Execute(“select * from student where 性别=’女’”); SQL语句的执行分两个过程先编译再执行,通过Statement对象发送SQL语句时,DBMS负责解释指令,执行指令,完成相关的数据库操作。如果用户不断的向数据库提交SQL语句,势必增加DBMS的负担,影响执行速度。在多次发送SQL语句的前提下,可使用PreparedStatement接口对象完成SQL语句的发送操作,PreparedStatement继承Statement,它完全继承Statement的所有操作,但是又不同于Statement,当使用PreparedStatement发送SQL语句时,大多数情况下这个SQL语句已经事先编译过,因而DBMS无需临时编译,只需执行即可。这不仅节省了SQL语句的编译时间,也减轻了DBMS的负担,从而提高了数据库的访问效率,因此PreparedStatement对象习惯性被称为预处理语句对象。当然使用PreparedStatement对象提高数据库访问效率的前提是SQL语句被多次发送,如果只发送一次SQL语句则使用PreparedStatement对象与Statement对象效率一样。
使用PreparedStatement对象可以执行动态的SQL语句,当有些操作只是SQL语句的某些参数会有些不同,其余的SQL子句皆相同时,则可以使用PreparedStatement对象来提高执行效率,而且还可以避免Statement对象发送SQL语句的SQL注入问题,通过setXXX方法指定相应参数,有效地解决了SQL注入问题。
(二)调用存储过程
存储过程在概念上类似于程序中的函数,它以黑盒形式运行并返回相应信息,存储过程由数据引擎执行,无论是将信息输入到存储过程还是从存储过程将信息输出都必须通过与数据库交互的技术来完成的。CallableStatement对象为所有的DBMS提供了一种以标准形式调用存储过程的方法,CallableStatement对象与PreparedStatement对象一样都是一个预处理语句对象,可被多次使用,但是相对于Statement对象和PreparedStatement对象其具有以下优点:
1. 存储过程在服务器端运行,执行速度快。
2. 存储过程执行一次后,其字节码文件就驻留高速缓冲存储器,在以后的操作中,无需再编译即可执行,提高了系统性能。
3. 自动完成需要预先执行的任务,不必在系统启动后再进行手工操作,大大方便用户的使用。
(三)使用数据集对象转存技术
当对数据库中的数据记录进行操作时,一般都是先将数据记录暂存在ResultSet对象中,在需要时再将其传递给所需的对象,但是,使用ResultSet对象暂存数据记录的前提是一直需要与数据库保持连接,系统资源将一直被占用而无法释放。数据集对象转存技术就是将ResultSet对象保存的数据记录转存到CachedRowSetImpl对象中,CachedRowSetImpl对象既可以保存ResultSet对象中的数据,而且不依赖于Connection对象,这意味着即使关闭数据库连接也能访问数据库表中的数据,这样ResultSet对象,Statement对象以及Connection对象都可以提前关闭,释放了系统资源,提高了系统性能。
另外当进行分页显示操作时,使用数据库提供的定位集的SQL语句,可以有效的提高执行效率。此方法是将获取的查询请求的行范围作为参数,通过这些参数生成SQL查询语句,然后每次请求获得一个数据库连接对象并执行SQL查询,把查询结果返回给用户,最后释放所有的数据库访问资源,该种方法无论是从内存资源占用角度还是数据库资源占用角度看都是最为合理的,也是效率最高的一种形式。
(四)JSP程序开发模式选择
JSP程序开发模式有四种:1. 单纯的JSP页面编程。2. JSP+JavaBean编程。3. JSP+Servlet+JavaBean编程。4. MVC模式。对于单纯的JSP页面编程模式,是将访问数据库的所有代码都写入了JSP页面,这样会导致编程难度加大,同时代码的可维护性和重用性都得不到满足。因此,尽可能的避免在JSP页面中直接写入大量的逻辑代码,把访问数据库的代码尽可能的放在JavaBean或者Servlet中,这样,不仅页面容易维护,代码也能得到很好的重用。
优化Java访问数据库的效率,应该首先从系统的应用范围考虑,选择合适的数据库,然后再针对不同的应用领域选择合适的驱动模式,最后针对不同的数据库操作在编程中尽可能的优化。当然,除了本文中提到的方法之外,还可以使用连接池技术等达到优化的目的,另外,硬件配置的提高也是优化Java访问数据库效率的重要方面,我们应该根据实际需要,采用硬、软件相结合的方式,以达到提高Java访问数据库效率的目的。
作者单位:广东外语外贸大学南国商学院信息科学技术学院