基于JDBC的Web数据库应用程序性能优化研究

来源:互联网 发布:网络推广工作职责 编辑:程序博客网 时间:2024/05/10 19:39

JDBC的结构和应用模式

    JDBC是一种可用于执行SQL语句的Java API,由一些Java语言编写的类和接口组成。JDBC为数据库应用开发人员、数据库前台开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用。通过使用JDBC,开发人员可以很方便的将SQL语句传送给几乎任何一种数据库,有很好的可移植性。JDBC的结构和工作过程如图2。用JDBC进行数据库访问的操作步骤:①引入java.sql与javax.sql软件包;②装载JDBC驱动库;③用Connection接口建立一个到数据库的连接对象;④通过SQL语句建立一个Statement对象;⑤通过Statement执行数据库操作;⑥获取数据库数据或更新数据库数据;⑦关闭结果集对象ResultSet、Statement对象与Connection对象。

图2  JDBC的结构和工作过程

 

    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{
            Class.froName(“com.mysql.jdbc.Driver”).newInstance();
//加载MySQL数据库驱动
            conn=DriverManager.getConnection(url,user,pw);
//获取数据库的连接
            conn.setAutoCommit(false);
            stmt=conn.createStatement();
            stmt.executeUpdate(“SQL语句1”);// 数据库更新操作1
            stmt.executeUpdate(“SQL语句2”);// 数据库更新操作2
            conn.commit();//事务提交
        }catch(Exception ex){
            ex.printStackTrace();
    try{
           conn.rollback();//操作不成功则回滚
        }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)tx.lookup(“java:comp/env/jdbc/ sdb”)//获得数据源对象
    Conn=datas.getConnection();//从数据源连接池中取得一个数据库连接
连接池的实现未必都有JDBC驱动器开发商提供,可以从第三方得到,甚至程序开发人员可以自己开发。

6  Web数据库关系数据模型优化

    为了提高Web数据库应用系统的性能在优化JDBC的基础上,可以对数据库库的关系模型进性优化。①对关系模式进行逆规范化,当查询操作涉及多个关系时,对那些使用频率高、要求响应速度快的查询操作设计的关系适当合并,以减少对关联的操作,提高数据库的响应速率。②对关系模式进行垂直分割,当关系中一部分属性使用频率高,而另一部分属性使用率低,可将关系分解为两个关系,降低单位时间内所有应用需要存取的数据量.③对关系模式进行水平分割,即根据关系中某属性把关系分解成多个关系,这样能够在查询的时候迅速定位,提高查询速度。比如校学生管理信息管理系统中,定义学生的属性,学生:(学号,姓名,性别,班级,学院)。因不同的用户在访问时关心的是不同学院的学生,所以就可以学院属性把关系分割为多个关系。

总结

    本文主要针对目前在Web应用程序开发中使用JDBC技术解决数据库访问时,提出了解决性能问题的若干方法,并对这些方法的提升Web数据库性能的原理进行了分析,最后提出了对关系数据模型优化方法,这些技术方法在开发中都得到了验证,能够提升Web应用程序在服务上的性能。
原创粉丝点击