日期:2014-05-16  浏览次数:20516 次

(翻译)Tomcat JDBC 连接池

介绍

org.apache.tomcat.jdbc.pool 包的 JDBC 连接池被用来替代 commons-dbcp 连接池。

为什么我们需要一个新的连接池?

有这样一些原因:

1.?????? commons-dbcp 是单线程的,即使是查询验证过程也以线程锁锁定整个池。

2.?????? commons-dbcp 性能低下——在 cpu 核心数量不断成长的今天,即使 Java6 对同步关键字提供巨大优化效果, commons-dbcp 仍然不支持高并发。

3.?????? commons-dbcp 复杂度高,超过 60 个类, tomcat-jdbc-pool 只有 8 个核心类,可以最小修改量应对对未来需求。你需要的仅仅是一个连接池,其他的都不重要。

4.?????? commons-dbcp 使用静态接口。意味着你不能在 JDK1.6 下编译它,否则即使驱动程序支持的方法, dbcp 不支持的方法,在运行时也将出现 NoSuchMethodException 异常。

5.?????? commons-dbcp 呆滞。更新、释放和对新特性的支持相当缓慢。

6.?????? 如果可以简单得多的方式实现连接池,我们就不需要重写 60 多个类。

7.?????? Tomcat JDBC 连接池支持公平列队选项,这在 commons-dbcp 上是不支持的,但性能仍然比 commons-dbcp 快。

8.?????? Tomcat JDBC 连接池可以在不开启新线程的情况下异步地回收连接。

9.?????? Tomcat JDBC 连接池吃一个 Tomcat 模块,依赖于 Tomcat JULI ——一个 Tomcat 使用的精简的日志框架。

10.?? 收回使用 javax.sql.PooledConnection 接口的相关连接。

11.?? 饥饿测试。如果一个池是空的,并且有线程正在等待一个连接,当一个连接被退还,这个池将唤醒当前等待的线程。多数连接池会被饿死。

相比其他连接池实现增加的特性:

1.?????? 支持多线程环节和多核心 /cpu 系统。

2.?????? 动态实现接口,可支持特定 runtime java.sql javax.sql 接口(需 JDBC 驱动支持),即使在低版本的 JDK 编译。

3.?????? 验证间隔——没有在每次使用连接时进行验证,而仅仅在取用和归还连接时,我们只需要配置最高验证频率。

4.?????? 单次查询——当数据库创建连接之后,可以执行一个可配置的查询。当你需要整个连接期间只需要查询一次的话,这个功能非常有用。

5.??????