1 引言 随着Internet的广泛应用,由于B/S结构所拥有的投资维护成本低、客户端部署简单等特点。目前,Web应用程序正在以非常快的速度在增长,Web应用程序不再是简单显示信息的网站,而逐渐融合核心的业务逻辑,成为IT领域的业务处理平台。Java以其面向对象、跨平台、安全性、健壮性等优秀特性已成为开发Web应用的主要选择。JDBC为基于Java平台的Web应用程序完成数据库操作提供了完备的方法接口。基于JDBC的Web数据库应用程序的结构如图1所示。因Web数据库接受来自众多并发的客户端所发出的SQL操作,特别是在企业级应用中, Web应用程序需要尽可能快的执行SQL操作并返回结果,所以需要进一步优化数据库的访问性能。
2 JDBC的结构和应用模式 JDBC是一种可用于执行SQL语句的Java API,由一些Java语言编写的类和接口组成。JDBC为数据库应用开发人员、数据库前台开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用。通过使用JDBC,开发人员可以很方便的将SQL语句传送给几乎任何一种数据库,有很好的可移植性。JDBC的结构和工作过程如图2。用JDBC进行数据库访问的操作步骤:①引入与软件包;②装载JDBC驱动库;③用Connection接口建立一个到数据库的连接对象;④通过SQL语句建立一个Statement对象;⑤通过Statement执行数据库操作;⑥获取数据库数据或更新数据库数据;⑦关闭结果集对象ResultSet、Statement对象与Connection对象。
JDBC驱动器可以分为下面四种:①桥式驱动器,这种驱动器程序使用桥技术将Java应用程序与一个ODBC数据库连接。这种驱动器先将JDBC转化为ODBC驱动,应用程序依赖后者与数据库通信。桥式驱动器用本地代码实现,且必须安装ODBC管理器和配置ODBC驱动。一般不建议使用。②Native-API半Java驱动器,它通过native C语言库将JDBC调用转换成对数据库的客户API的调用,从而实现与数据库的通信。这种驱动一部分用Java语言编写,另一部分用native代码实现,因而性能相对比纯Java实现的驱动器要高,但在使用时,必须安装一些与平台有关的代码。③Net-Protocal全Java驱动器,它通过网络协议与中间层连接,而中间层可使用任何一种驱动来存取数据库。适应性好,使用方便灵活。④Native-Protocol全Java驱动器,这类驱动器将JDBC请求转化为与数据库相关的网络协议,不用借助任何其他帮助而直接对数据库进行存取。Net-Protocal全Java驱动器与Native-Protocol全Java驱动器运算速度较快,性能比较好。Net-Protocal全Java驱动器可以借助于应用服务器所提供连接池技术、缓冲技术、负载均衡技术等,获得较高的性能,适合于Web应用的开发。
3 优化Statement、ResultSet对象 与Connection对象一样,Statement对象是JDBC程序设计中非常重要的对象。它包含了SQL语句的查询和更新操作。它是操作数据库数据的载体,在对数据库的操作中,起着重要的作用。ResultSet对象是执行SQL语句后产生的结果集,通常是数据库的查询结果。其信息的形式可以认为是一张由行和列组成的二维数据表。通过对该结果集的操作,就可以获取各项数据。
3.1 选择正确的Statement对象并及时关闭 在JDBC技术规范中,共有3种不同类型的Statement对象。它们分别是:Statement、PreparedStatement和CallableStatement。 Statement对象用于执行不带参数的简单SQL语句;PreparedStatement对象用于执行带或不带IN参数的预编译SQL语句,由于PreparedStatement对象已经预编译过,所以起执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,可以提高数据库的总体效率;CallableStatement对象用于执行数据库已经存储的调用,存储过程是由SQL语句和流控制语句书写的过程程序,这个程序经数据库编译和优化后存储在数据库服务器中,充分利用存储过程来完成应用系统的逻辑操作处理可以提高系统的运行性能和可维护性。
3.2 采用合适的方法操作ResultSet对象 结果集读取数据的方法主要是getXXX(),其参数可以使用整型表示第几列,也可以是列名。返回的是对应的XXX的类型的值。使用getString()可以返回所有列的值,不过返回的都是字符串类型的。还可以通过使用getAsciiStream()获得该列对应的当前行的ascii流。但如果使用的方法与实际的数据域的类型不匹配,那么系统要将相应的字段数据进行类型转换,尤其是在查询返回巨大数据的时候,将会扩大系统开销,降低应用性能,对应用性能产生很大的影响。因此应尽量使用与数据域类型相匹配的方法获取所应用的数据域中的数据。
4 合理使用JDBC的数据库事务操作 合理使用事务功能促进数据访问的并发性。为了保证Web环境下多用户协调地访问数据,应注意根据情况使用锁定管理。JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。通过提交commit( )或者回滚rollback( )来结束事务的操作。在JDBC中,事务操作默认是自动提交的。也就是说,一条对数据库的更新表达式代表一项事务操作,操作完成后,系统将自动调用commit( )来提交,否则将调用rollback( )来回滚。可以通过调用setAutoCommit(false)来禁止自动提交,之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit( )进行整体提交,如果其中一个表达式操作失败,则不会执行到commit( ),并且将产生响应异 常,此时就可以在捕获异常时调用rollback( )进行回滚。下面的例子演示用于连接MySQL数据库中使用数据库事务的基本过程。 Connection cnt=null; String url=”jdbc:mysql://localhost:3306/sdb”; //sdb为测试用的数据库名 String user=”abc”; String pw=”123456”; //abc,pw分别为测试用的数据库用户名和密码 try{ e(“”).newInstance();//加载MySQL数据库驱动 conn=nection(url,user,pw);//获取数据库的连接 oCommit(false); stmt=Statement(); eUpdate(“SQL语句1”);// 数据库更新操作1 eUpdate(“SQL语句2”);// 数据库更新操作2 ();//事务提交 }catch(Exception ex){ tackTrace(); try{ ck();//操作不成功则回滚 }catch(Exception e){e. printStackTrace();}} 选择合适的事务隔离层,JDBC API支持事务对数据库的加锁,并且提供了5种操作支持、2种加锁密度。其中5种支持static int TRANSACTION_NONE=0;表示禁止事务操作和加锁。static int TRANSACTION_READ_ UNCOMMITTED =1;表示允许脏数据读写、重复读写和影响读写。static int TRANSACTION_READ_COMMITTED=2; 表示禁止脏数据读写,允许重复读写和影响读写。static int TRANSACTION_REPEATABLE_READ =4; 表示禁止脏数据读写和重复读写,允许影响读写。static int TRANSACTION_ SERIALIZABLE =8; 表示禁止脏数据读写和重复读写,允许影响读写。
5 采用数据池提高效率 在使用JDBC对数据库操作时,创建数据库连接对绝大多数驱动器而言都是一项昂贵的操作,要消耗一些资源,因此数据库的连接是一个影响性能的瓶颈。在Web数据库应用程序中,每一个HTTP请求都需要创建一个新的数据库连接,这样会降低程序的使用性能,甚至是Web服务器过载。因此,“开通连接,与数据库通信,关闭连接”的JDBC编程模式在Web应用程序中并不可取。采用连接池是一种解决以上问题很好的机制,它将若干个开通的数据库连接保持在一个缓存中,以共程序随时取用。程序需要时可以从连接池中取出一个连接,服务完毕后再将连接还给连接池。JDBC 2.0 扩展允许请求客户机透明地共享连接池中的多个连接对象,应用服务器供应商在其内存空间上实现连接池管理器,并根据需要动态地改变池的大小,从而优化资源的使用。以下为在Tomcat平台上数据源的调用方法: InitialContext tx=new InitialContext();//初始上下文对象 DataSource datas=( DataSource)(“java:comp/env/jdbc/ sdb”)//获得数据源对象 Conn=nection();//从数据源连接池中取得一个数据库连接连接池的实现未必都有JDBC驱动器开发商提供,可以从第三方得到,甚至程序开发人员可以自己开发。
6 Web数据库关系数据模型优化 为了提高Web数据库应用系统的性能在优化JDBC的基础上,可以对数据库库的关系模型进性优化。①对关系模式进行逆规范化,当查询操作涉及多个关系时,对那些使用频率高、要求响应速度快的查询操作设计的关系适当合并,以减少对关联的操作,提高数据库的响应速率。②对关系模式进行垂直分割,当关系中一部分属性使用频率高,而另一部分属性使用率低,可将关系分解为两个关系,降低单位时间内所有应用需要存取的数据量.③对关系模式进行水平分割,即根据关系中某属性把关系分解成多个关系,这样能够在查询的时候迅速定位,提高查询速度。比如校学生管理信息管理系统中,定义学生的属性,学生:(学号,姓名,性别,班级,学院)。因不同的用户在访问时关心的是不同学院的学生,所以就可以学院属性把关系分割为多个关系。
7 总结 本文主要针对目前在Web应用程序开发中使用JDBC技术解决数据库访问时,提出了解决性能问题的若干方法,并对这些方法的提升Web数据库性能的原理进行了分析,最后提出了对关系数据模型优化方法,这些技术方法在开发中都得到了验证,能够提升Web应用程序在服务上的性能。
参考文献[1] 萧仁惠、陈锦辉编着.JDBC数据库程序设计[M].北京:中国铁道出版社,2004.2 林胜利、王坤茹、孟海利编着.Java优化编程[M].北京: 电子工业出版社,2005.5 张晓东等编着.Java数据库高级教程[M].北京:清华大学出版社,2004 洪伟恩编着.深入浅出Java 2 面向对象程序设计[M].北京:中国铁道出版社,2004.5 张洪伟编着.Tomcat Web 开发及整合应用[M].北京:清华大学出版社,2006.2 徐小青,路晓村等译.MySQL安全手册[M].北京: 电子工业出版社,2004.11 刘方鑫主编.数据库原理与技术[M].北京:电子工业出版社,2002.2
中国论文网(www.lunwen.net.cn)免费学术期刊论文发表,目录,论文查重入口,本科毕业论文怎么写,职称论文范文,论文摘要,论文文献资料,毕业论文格式,论文检测降重服务。