首页 > 数据库技术 > 详细

【JDBC连接池】Tomcat连接池官方文档翻译v8.5.9

时间:2017-01-06 11:16:20      阅读:238      评论:0      收藏:0      [点我收藏+]

1.原文地址:http://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html
2.译者:chenjazz佳志
3.参考文档:http://wiki.jikexueyuan.com/project/tomcat/tomcat-jdbc-pool.html
4.【】中的文字原文中不存在,属于解释性的

===================以下为正文===================

一、简介

JDBC 连接池 org.apache.tomcat.jdbc.pool 是 Apache Commons DBCP 连接池的一种替换或备选方案。
那为什么需要一个新的连接池?

原因如下:
1. Commons DBCP 1.x 是单线程。为了线程安全,在对象分配或对象返回的短期时间内,DBCP 锁定了整个连接池。但注意这并不适用于 Commons DBCP 2.x。【对象指的是Connection对象】
2. Commons DBCP 1.x 可能会变得很慢。当逻辑 CPU 数目增长,或者试图借出或归还对象的并发线程增加时,性能就会受到影响。高并发系统受到的影响会更为显著。注意这并不适用于 Commons DBCP 2.x。
3. Commons DBCP 拥有 60 多个类。tomcat-jdbc-pool 核心只有 8 个类。因此如果未来需求变更着想,仅需要更少的改动。我们真正需要的只是连接池本身,其余的只是附属。
4. Commons DBCP 使用静态接口,因此对于指定版本的 JRE,只能采用正确版本的 DBCP,否则就会出现 NoSuchMethodException 异常。
5. 当DBCP 可以用其他更简便的实现来替代时,实在不值得重写那 60 个类。
6. Tomcat JDBC 连接池无需为库本身添加额外线程,就能获取异步获取连接。
7. Tomcat JDBC 连接池是 Tomcat 的一个模块,仅依赖Tomcat JULI 这个Tomcat中的简化日志架构。
8. 可以使用 javax.sql.PooledConnection 接口获取底层连接。
9. 防止饥饿。如果池变空,线程将等待一个连接。当连接返回时,池就将唤醒正确的等待线程。大多数连接池只会一直维持饥饿状态。【?此处有一些不解】

Tomcat JDBC 连接池还具有一些其他连接池实现所没有的特点:

  1. 支持高并发环境与多核/CPU 系统。
  2. 接口的动态实现。在你的运行环境下支持 java.sql 与 java.sql 接口(就像 JDBC 驱动一样),甚至在利用低版本的 JDK 来编译时。
  3. 验证间隔时间。我们不必每次使用单个连接时都进行验证,可以在借出(borrow )或归还(return )连接时进行验证,只要不低于我们所设定的间隔时间就行。
  4. 只执行一次查询。当与数据库建立起连接时,只执行一次的可配置查询。这项功能对会话设置非常有用,因为你可能会想在连接建立的整个时段内都保持会话。
  5. 能够配置自定义拦截器。通过自定义拦截器来增强功能。可以使用拦截器来采集查询统计,缓存会话状态,重新连接之前失败的连接,重新查询,缓存查询结果,等等。可以使用大量的选项并且自定义拦截器也是没有限制的没有绑定到特定版本JDK的 java.sql/javax.sql 接口。
  6. 高性能。后文将举例展示一些性能差异。
  7. 极其简单。它的实现非常简单,代码行数与源文件都非常少,这都有赖于从一开始研发它时,就把简洁当做重中之重。对比一下 c3p0 ,它的源文件超过了 200 个(最近一次统计),而 Tomcat JDBC 核心只有 8 个文件,连接池本身则大约只有这个数目的一半,所以能够轻易地跟踪和修改可能出现的 Bug。
  8. 异步连接获取。可将连接请求队列化,系统返回 Future<Connection>
  9. 更好地处理空闲连接。不再直接把空闲连接关闭,通过更为巧妙的算法控制空闲连接池的规模。
  10. 可以控制连接应被废弃的时间:当池满了即废弃,或者指定一个池使用容差值,发生超时就进行废弃处理。
  11. 通过查询或语句来重置废弃连接计时器。允许一个使用了很长时间的连接不因为超时而被废弃。这一点是通过使用 ResetAbandonedTimer 来实现的。
  12. 经过指定时间后,关闭连接。与返回池的时间相类似。
  13. 当连接要被释放时,获取 JMX 通知并记录所有日志。它类似于 removeAbandonedTimeout,但却不需要采取任何行为,只报告信息。通过 suspectTimeout 属性来实现。
  14. 可以通过 java.sql.Driver、javax.sql.DataSource 或 javax.sql.XADataSource 获取连接。通过 dataSource 与 dataSourceJNDI 属性实现这一点。
  15. 支持 XA 连接。
  16. 16.

二、如何使用

对于熟悉 Commons DBCP 的人来说,转而使用 Tomcat 连接池是非常简单的事。从其他连接池转换过来也非常容易。

附加功能

除了其他多数连接池能够提供的功能外,Tomcat 连接池还提供了一些附加功能:
- initSQL 当连接创建后,能够执行一个 SQL 语句(只执行一次)。
- validationInterval 恰当地在连接上运行验证,同时又能避免太多频繁地执行验证。
- jdbcInterceptors 灵活并且可插拔的拦截器,能够对池进行各种自定义,执行各种查询,处理结果集。下文将予以详述。
- fairQueue 将 fair 标志设为 true,以达成线程公平性,或使用异步连接获取。

Apache Tomcat 容器内部使用

Tomcat JDBC 文档描述中:(在Tomcat 容器内部,)Tomcat 连接池被配置为一个资源。唯一的区别在于,你必须指定 factory 属性,并将其值设为 org.apache.tomcat.jdbc.pool.DataSourceFactory。

独立使用

连接池只有一个依赖文件,tomcat-juli.jar。要想在使用 bean 实例化的单一项目中使用池,实例化的 Bean 为org.apache.tomcat.jdbc.pool.DataSource。下文讲到将连接池配置为 JNDI 资源时会涉及到同一属性,也是用来将数据源配置成 bean 的。

JMX

连接池对象暴露了一个可以被注册的 MBean。为了让连接池对象创建 MBean,jmxEnabled 标志必须设为 true。这并不是说连接池会注册到 MBean 服务器。在像 Tomcat 这样的容器中,Tomcat 本身注册就在 MBean 服务器上注册了 DataSource。org.apache.tomcat.jdbc.pool.DataSource 对象会注册实际的连接池 MBean。如果你在容器外运行,可以将 DataSource 注册在任何你指定的对象名下,然后将这种注册传播到底层池。要想这样做,你必须调用 mBeanServer.registerMBean(dataSource.getPool().getJmxPool(),objectname)。在调用之前,一定要保证通过调用 dataSource.createPool() 创建了池。

三、属性

为了能够顺畅地在 Commons DBCP 与 Tomcat JDBC 连接池 之间转换,大多数属性名称及其含义都是相同的。

1. JNDI 工厂与类型

属性 描述
factory 必需的属性,其值应为 org.apache.tomcat.jdbc.pool.DataSourceFactory
type 类型应为 javax.sql.DataSource 或 javax.sql.XADataSource。根据类型,将创建org.apache.tomcat.jdbc.pool.DataSource和org.apache.tomcat.jdbc.pool.XADataSource。

2. 系统属性

系统属性作用于 JVM 范围,影响创建于 JVM 内的所有池。

属性 描述
org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader 布尔值,默认为 false。控制动态类(如JDBC 驱动、拦截器、验证器)的加载。如果采用默认值,池会首先利用当前类加载器(比如已经加载池类的类加载器)加载类;如果类加载失败,则尝试利用线程上下文加载器加载。取值为 true 时,会向后兼容 Apache Tomcat 8.0.8 及更早版本,只会采用当前类加载器。如果未设置,则取默认值。

3. 常用属性

属性 描述
defaultAutoCommit (布尔值)连接池所创建的连接默认自动提交状态。如果未设置,则默认采用 JDBC 驱动的缺省值(如果未设置,则不会调用 setAutoCommit 方法)。
defaultReadOnly (布尔值)连接池所创建的连接默认只读状态。如果未设置,将不会调用 setReadOnly 方法。(有些驱动并不支持只读模式,比如:informix),
defaultTransactionIsolation (字符串)连接池所创建的连接的默认事务隔离状态。取值范围为:(参考 javadoc)NONEREAD_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ、SERIALIZABLE如果未设置该值,则不会调用任何方法,默认为 JDBC 驱动。
defaultCatalog (字符串)连接池所创建的连接的默认catalog。
driverClassName (字符串)所要使用的 JDBC 驱动的完全限定的 Java 类名。该驱动必须能从与 tomcat-jdbc.jar 同样的类加载器访问
username (字符串)传入 JDBC 驱动以便建立连接的连接用户名。注意,DataSource.getConnection(username,password) 方法默认不会使用传入该方法内的凭证,但会使用这里的配置信息。可参看 alternateUsernameAllowed 了解更多详情。
password (字符串)传入 JDBC 驱动以便建立连接的连接密码。注意,DataSource.getConnection(username,password) 方法默认不会使用传入该方法内的凭证,但会使用这里的配置信息。可参看 alternateUsernameAllowed 了解更多详情。
maxActive (整形值)池同时能分配的活跃连接的最大数目。默认为 100。
maxIdle (整型值)池始终都应保留的连接的最大数目。默认为 maxActive:100。会周期性检查空闲连接(如果启用该功能),留滞时间超过 minEvictableIdleTimeMillis 的空闲连接将会被释放。(请参考 testWhileIdle)
minIdle (整型值)池始终都应保留的连接的最小数目。如果验证查询失败,则连接池会缩减该值。默认值取自 initialSize:10(请参考 testWhileIdle)。
initialSize (整型值)连接器启动时创建的初始连接数。默认为 10。
maxWait (整型值)在抛出异常之前,连接池等待(没有可用连接时)返回连接的最长时间,以毫秒计。默认为 30000(30 秒)
testOnBorrow (布尔值)默认值为 false。从池中借出对象之前,是否对其进行验证。如果对象验证失败,将其从池中清除,再接着去借下一个。注意:为了让 true 值生效,validationQuery 参数必须为非空字符串。为了实现更高效的验证,可以采用 validationInterval。
testOnReturn (布尔值)默认值为 false。将对象返回池之前,是否对齐进行验证。注意:为了让 true 值生效,validationQuery 参数必须为非空字符串。
testWhileIdle (布尔值)是否通过空闲对象清除者(如果存在的话)验证对象。如果对象验证失败,则将其从池中清除。注意:为了让 true 值生效,validationQuery 参数必须为非空字符串。该属性默认值为 false,为了运行池的清除/测试线程,必须设置该值。(另请参阅 timeBetweenEvictionRunsMillis)
validationQuery (字符串)在将池中连接返回给调用者之前,用于验证这些连接的 SQL 查询。如果指定该值,则该查询不必返回任何数据,只是不抛出 SQLException 异常。默认为 null。实例值为:SELECT 1(MySQL) select 1 from dual(Oracle) SELECT 1(MySQL Server)。
validationQueryTimeout (整型值)连接验证失败前的超时时间(以秒计)。通过在执行
validatorClassName (字符串)实现 org.apache.tomcat.jdbc.pool.Validator 接口并提供了一个无参(可能是隐式的)构造函数的类名。如果指定该值,将通过该类来创建一个 Validator 实例来验证连接,代替任何验证查询。默认为 null,范例值为:com.mycompany.project.SimpleValidator。
timeBetweenEvictionRunsMillis (整型值)空闲连接验证/清除线程运行之间的休眠时间(以毫秒计)。不能低于 1 秒。该值决定了我们检查空闲连接、废弃连接的频率,以及验证空闲连接的频率。默认为 5000(5 秒)
numTestsPerEvictionRun (整型值)Tomcat JDBC 连接池没有用到这个属性。
minEvictableIdleTimeMillis (整型值)在被确定应被清除之前,对象在池中保持空闲状态的最短时间(以毫秒计)。默认为 60000(60 秒)
accessToUnderlyingConnectionAllowed (布尔值)没有用到的属性。可以在归入池内的连接上调用 unwrap来访问。参阅 javax.sql.DataSource 接口的相关介绍,或者通过反射调用 getConnection,或者将对象映射为 javax.sql.PooledConnection。
removeAbandoned (布尔值)该值为标志(Flag)值,表示如果连接时间超出了 removeAbandonedTimeout,则将清除废弃连接。如果该值被设置为 true,则如果连接时间大于 removeAbandonedTimeout,该连接会被认为是废弃连接,应予以清除。若应用关闭连接失败时,将该值设为 true 能够恢复该应用的数据库连接。另请参阅 logAbandoned。默认值为 false。
removeAbandonedTimeout (整型值)在废弃连接(仍在使用)可以被清除之前的超时秒数。默认为 60(60 秒)。应把该值设定为应用可能具有的运行时间最长的查询。
logAbandoned (布尔值)标志能够针对丢弃连接的应用代码,进行堆栈跟踪记录。由于生成堆栈跟踪,对废弃连接的日志记录会增加每一个借取连接的开销。默认为 false
connectionProperties (字符串)在建立新连接时,发送给 JDBC 驱动的连接属性。字符串格式必须为:[propertyName=property;]*。注意:user 与 password 属性会显式传入,因此这里并不需要包括它们。默认为 null。
poolPreparedStatements (布尔值)未使用的属性
maxOpenPreparedStatements (整型值)未使用的属性

4.增强属性

【JDBC连接池】Tomcat连接池官方文档翻译v8.5.9

原文:http://blog.csdn.net/u011179993/article/details/54099214

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!