——JDBC 篇(一)
驱动程序的选择
在企业级的Java应用中,访问数据库是一个必备的环节。数据库作为数据资源的集散地,往往位于企业级软件体系的后方,供前方的应用程序访问。在Java技术的体系中,应用程序是通过JDBC(Java Database Connectivity)接口来访问数据库的,JDBC支持"建立连接、SQL语句查询、处理结果"等基本功能。在应用JDBC接口访问数据库的过程中,只要根据规范来操作,这些功能的实现不会出差错。但是,有些时候进行数据查询的效率着实让开发人员懊恼不已,明明根据规范编写的程序,却得不到预期的运行效果,造成了整个软件的执行效率不高。
访问数据库的性能主要有两个因素决定。一是数据库服务器本身的性能,如数据库管理系统、数据库结构的设计;其二就是与数据库相对独立的JDBC应用编程接口(API)的使用也很大程度上影响着JDBC程序的性能。前一点不属于我们讨论的范围,我们不做详细论述。
JDBC数据库访问机制:
图一
图二
· 图一左边的分支称为Type 1驱动模式,即通常由Sun公司提供的JDBC-ODBC桥,加上一个ODBC驱动,它提供了经由一种或多种ODBC驱动进行访问的JDBC接口。通常的DBMS都支持微软提出的ODBC规范,因此该模式可以普遍使用,非常灵活,具有很好的代码移植性。 但该模式不适用于high-transaction环境,也没有好的支持,并且功能有限。因为每次调用都要转换成ODBC调用,所以这种模式与其他模式相比性能最差。因而Type 1仅适用于下载和自动安装Java程序不重要、实验用途或者没有其它JDBC驱动可用的情况下,绝不推荐用于生产。
· 图一右边的分支成为Type 2驱动模式,类似于JDBC-ODBC桥接器,需要加载到客户机,却是一个部分用Java实现的驱动接口。使用本地API,它将JDBC调用转换为对数据库(Oracle、Sybase、Informix、DB2等)客户端接口的调用。
· 图二左边的分支称为Type 4驱动模式,它一般是数据库厂商才能实现的纯Java的基于本地协议的驱动,直接调用DBMS(数据库管理系统)使用的网络协议,对于企业内部互联网来说,是一个实用的解决方案。
· 图二右边的分支称为Type 3驱动模式,它同样是一个纯Java驱动,不同于Type 4驱动模式的是基于网络协议。它的机制是将JDBC调用转换为中间网络协议,然后转换为DBMS协议。中间网络协议层起到一个读取数据库的中间件的作用,能够连接许多类型的数据库,因而是最灵活的JDBC模式。
了解了现有的JDBC驱动类型以后,我们做一下综合分析:
Type1驱动支持多种数据库访问,理论上利用客户机本地代码库,可以加速数据访问的执行,但因为要做JDBC——ODBC转换,相应的开销绝对大于前者产生的性能提高,因此不可能有好的性能支持。由于多种原因,该类驱动得不到服务商的好的支持,使其无论性能还是功能都相对差劲,事实上该类驱动基本上得不到使用。
Type2驱动类似于Type1,利用了客户机本地代码,虽然不需要将数据库请求转换成ODBC调用,但有二进制代码客户端装载开销,不太可能有好的性能。另外,虽然其上层用Java实现,但因为与下层本地代码邦定紧密,无论是跨平台应用还是多数据库支持都很限制。因此不推荐该类型驱动。
Type3驱动是纯Java驱动,一般由应用服务器提供商集成到应用服务器中,为三层结构,能连接许多类型的数据库,非常灵活。看似中间多了一个环节,但应用服务器提供这种驱动程序的同时也提供了很多优化的功能,它们一般还会配套的提供连接池、数据缓冲区、负载均衡等,所以性能并不差。
Type4驱动也是纯Java驱动,但其直接访问数据库。一般说来,商业DBMS的提供者往往会为自己的数据库提供Type4的JDBC接口。这种模式的优势在于和数据库本身结合比较紧密,而且是纯Java的实现,在企业级的软件应用中,应该是首选。另外,第三方也给于大力支持。例如,对于Oracle数据库来说,有Oracle、SilverStream、DataDirect等公司提供这种类型的驱动,其性能往往被评价为最高效的、最可靠的驱动程序。但偶尔也有比较麻烦的情况,例如微软就不会提供MS SQL的JDBC接口(至少目前笔者了解的情况是这样),这时就需要到Sun的网站(http://industry.java.sun.com/products/jdbc/drivers)查找相关的模式4驱动,上面提到的DataDirect公司(http://www.datadirect-technologies.com/jdbc/jdbc.asp)就提供了支持MS SQL的Type4驱动,只是你需要支付$购买这个JDBC驱动。
Type3和Type4第三方驱动可能会提供比数据库商的驱动更好的性能, 并且能更好的执行,究其原因也是显而易见的,驱动商全神贯注于驱动,数据库商有更多其他的事情要考虑。
同样是纯Java实现的Type3,与Type4相比,优势在于对多种数据库的支持,体现了其灵活性。在大型的企业级的软件应用中,后台数据库往往不是一个,而且是由不同的厂商支持的。不过,Type3的JDBC驱动往往提供许多企业级的特征,例如SSL安全、支持分布式事务处理和集中管理等,因而会对你特殊的用途有很大的帮助。至于其性能,二者相当。如何选择,就看你应用的需要了。
综上所述,如果可能,Type1绝不要用,Type3和Type4由于众多厂商的支持,有连接池、数据缓冲等技术的使用,性能比Type2和Type1都要好,又都是纯Java的实现,属于首选。
另外普遍反映,对于Oracle数据库,尽管Oracle说OCI驱动为最佳的客户端访问驱动,但事实上Thin驱动程序可以获得更好的性能。