日期:2014-05-16 浏览次数:20536 次
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.??????