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