Java 访问数据库的速度瓶颈问题的分析及解决
速度瓶颈问题的提出
在企业级的 Java 应用中,访问数据库是一个必备的环节。数据库作为数据资源的集散地,往往位于 企业级软件体系的后方, 供前方的应用程序访问。 Java 技术的体系中, 在 应用程序是通过 JDBC (Java Database Connectivity)接口来访问数据库的,JDBC 支持"建立连接、SQL 语句查询、处理结果"等 基本功能。在应用 JDBC 接口访问数据库的过程中,只要根据规范来操作,这些功能的实现不会出差 错。但是,有些时候进行数据
查询的效率着实让开发人员懊恼不已,明明根据规范编写的程序,却得 不到预期的运行效果,造成了整个软件的执行效率不高。 起初,我们把问题归结于 Java 字节码加载和执行速度的缓慢,紧接着硬件的功能普遍得到了增强, 证明这样的想法些许是错误的,还没有抓到真正的根本原因。本文将逐步解剖 JDBC 访问数据库的机 制,深层分析造成这种速度瓶颈问题的原因,并提出在现有的 Java 技术框架下解决这个速度瓶颈问 题的思路和方法。
JDBC 访问数据库的机制
图1
图2
图 1 和图 2 描述了 Java 应用程序通过 JDBC 接口访问数据库的 4 种驱动模式,也就是底层实现 JDBC 接口的模式。对于这些模式,我们逐一介绍: 模式 4: 1 左边的分支称为模式 4, 图 它一般是数据库厂商才能实现的纯 Java 的基于本地协议的驱动, 直接调用 DBMS(数据库
管理系统)使用的网络协议,对于企业内部互联网来说,是一个实用的解决
方案。 模式 3:图 1 右边的分支称为模式 3,它同样是一个纯 Java 驱动,不同于模式 4 的是基于网络协议。 它的机制是将 JDBC 调用转换为中间
网络协议,然后转换为 DBMS 协议。中间网络协议层起到一个读取 数据库的中间件的作用,能够连接许多类型的数据库,因而是最灵活的 JDBC 模式。这种模式的产品 比较适用于企业内部互联网,如若支持国际互联网,还需添加对安全、穿过防火墙访问等的支持。 模式 1:图 2 左边的分支称为模式 1,即通常由 Sun 公司提供的 JDBC-ODBC 桥接器。它提供了经由一 种或多种 ODBC 驱动进行访问的 JDBC 接口,而 ODBC 驱动,在很多情况下也即数据库的客户端,必须 加载到客户机。因而,它适用于下载和自动安装 Java 程序不重要、实验用途或者没有其它 JDBC 驱动
可用的情况下。 模式 2:图 2 右边的分支成为模式 2,类似于 JDBC-ODBC 桥接器,需要加载到客户机,却是一个部分 用 Java 实现的驱动接口。它将 JDBC 调用转换为对数据库(Oracle、Sybase、Informix、DB2 等)客 户端接口的调用。
不同模式的 JDBC 接口的选择
以上阐述的 JDBC 接口的模
式不同,让我们可以把 JDBC 接口按照实现的模式分为四类。有些同仁可能 有这样的体会,选择不同的 JDBC 接口会有不同的访问速度,为何会出现这样的情况?这个
问题的答 案是,不同的应用需要不同模式的 JDBC 接口,因而我们在面对一个应用时,要慎重选择 JDBC 接口。 通常的 DBMS 都支持微软提出的 ODBC 规范,因而模式 1 可当作您在软件时的选择,它易于 配置的特性能够让你把选择 JDBC 等烦恼的问题暂且抛在一边, 让自己的 Java 程序能够及早地正常工 作起来。 一般说来,商业 DBMS 的提供者往往会为自己的数据库提供一个 JDBC 接口,应用的是模式 4。这种模 式的优势在于和数据库本身结合比较紧密,而且是纯 Java 的实现,在企业级的软件应用中,应该是 首选。例如,对于 Oracle 数据库来说,有 Oracle、SilverStream、DataDirect 等公司提供这种类型 的驱动,其性能往往被评价为最高效的、最可靠的驱动
程序。但偶尔也有比较麻烦的情况,例如微软 就 不 会 提 供 MS SQL 的 JDBC 接 口 , 这 时 就 需 要 到 Sun 的 网 站 (industry.java.sun/products/jdbc/drivers industry.java.sun/products/jdbc/drivers)查找相关的模式 4 驱