java监控tomcatjdbc_Tomcat的JDBC连接池
简介
JDBC 连接池 at.jdbc.pool 是 Apache Commons DBCP 连接池的⼀种替换或备选⽅案。
那究竟为何需要⼀个新的连接池?
原因如下:
Commons DBCP 1.x 是单线程。为了线程安全,在对象分配或对象返回的短期内,Commons 锁定了全部池。但注意这并不适⽤于Commons DBCP 2.x。
Commons DBCP 1.x 可能会变得很慢。当逻辑 CPU 数⽬增长,或者试图借出或归还对象的并发线程增加时,性能就会受到影响。⾼并发系统受到的影响会更为显著。注意这并不适⽤于 Commons DBCP 2.x。
Commons DBCP 拥有 60 多个类。tomcat-jdbc-pool 核⼼只有 8 个类。因此为了未来需求变更着想,肯定需要更少的改动。我们真正需要的只是连接池本⾝,其余的只是附属。
十一祝福短信Commons DBCP 使⽤静态接⼝,因此对于指定版本的 JRE,只能采⽤正确版本的 DBCP,否则就会出现 NoSuchMethodException 异常。
当DBCP 可以⽤其他更简便的实现来替代时,实在不值得重写那 60 个类。
Tomcat JDBC 连接池⽆需为库本⾝添加额外线程,就能获取异步获取连接。
Tomcat JDBC 连接池是 Tomcat 的⼀个模块,依靠 Tomcat JULI 这个简化了的⽇志架构。
使⽤ javax.sql.PooledConnection 接⼝获取底层连接。
防⽌饥饿。如果池变空,线程将等待⼀个连接。当连接返回时,池就将唤醒正确的等待线程。⼤多数连接池只会⼀直维持饥饿状态。
Tomcat JDBC 连接池还具有⼀些其他连接池实现所没有的特点:
⽀持⾼并发环境与多核/CPU 系统。
接⼝的动态实现。⽀持 java.sql 与 java.sql 接⼝(只要 JDBC 驱动),甚⾄在利⽤低版本的 JDK 来编译时。
验证间隔时间。我们不必每次使⽤单个连接时都进⾏验证,可以在借出或归还连接时进⾏验证,只要不低于我们所设定的间隔时间就⾏。
只执⾏⼀次查询。当与数据库建⽴起连接时,只执⾏⼀次的可配置查询。这项功能对会话设置⾮常有⽤,因为你可能会想在连接建⽴的整个时段内都保持会话。
能够配置⾃定义。通过⾃定义来增强功能。可以使⽤来采集查询统计,缓存会话状态,重新连接之前失败的连接,重新查询,缓存查询结果,等等。由于可以使⽤⼤量的选项,所以这种⾃定义也是没有限制的,跟 java.sql/javax.sql 接⼝的 JDK 版本没有任何关系。
⾼性能。后⽂将举例展⽰⼀些性能差异。
极其简单。它的实现⾮常简单,代码⾏数与源⽂件都⾮常少,这都有赖于从⼀开始研发它时,就把简洁当做重中之重。对⽐⼀下 c3p0 ,它的源⽂件超过了 200 个(最近⼀次统计),⽽ Tomcat JDBC 核⼼只有 8 个⽂件,连接池本⾝则⼤约只有这个数⽬的⼀半,所以能够轻易地跟踪和修改可能出现的 Bug。
异步连接获取。可将连接请求队列化,系统返回 Future。
更好地处理空闲连接。不再简单粗暴地直接把空闲连接关闭,⽽是仍然把连接保留在池中,通过更为
巧妙的算法控制空闲连接池的规模。
可以控制连接应被废弃的时间:当池满了即废弃,或者指定⼀个池使⽤容差值,发⽣超时就进⾏废弃处理。
通过查询或语句来重置废弃连接计时器。允许⼀个使⽤了很长时间的连接不因为超时⽽被废弃。这⼀点是通过使
⽤ ResetAbandonedTimer来实现的。
经过指定时间后,关闭连接。与返回池的时间相类似。
当连接要被释放时,获取 JMX 通知并记录所有⽇志。它类似于 removeAbandonedTimeout,但却不需要采取任何⾏为,只需要报告信息即可。通过 suspectTimeout 属性来实现。
可以通过 java.sql.Driver、javax.sql.DataSource 或 javax.sql.XADataSource 获取连接。通过 dataSource 与 dataSourceJNDI 属性实现这⼀点。2021年最新国庆节快乐图片
⽀持 XA 连接。
使⽤⽅法
对于熟悉 Commons DBCP 的⼈来说,转⽽使⽤ Tomcat 连接池是⾮常简单的事。从其他连接池转换过来也⾮常容易。
1. 附加功能
除了其他多数连接池能够提供的功能外,Tomcat 连接池还提供了⼀些附加功能:
initSQL 当连接创建后,能够执⾏⼀个 SQL 语句(只执⾏⼀次)。
validationInterval 恰当地在连接上运⾏验证,同时⼜能避免太多频繁地执⾏验证。
jdbcInterceptors 灵活并且可插拔的,能够对池进⾏各种⾃定义,执⾏各种查询,处理结果集。下⽂将予以详述。
fairQueue 将 fair 标志设为 true,以达成线程公平性,或使⽤异步连接获取。
2. Apache Tomcat 容器内部
在Tomcat JDBC ⽂档中,Tomcat 连接池被配置为⼀个资源。唯⼀的区别在于,你必须指定 factory 属性,并将其值设
为 at.jdbc.pool.DataSourceFactory。
3. 独⽴性
连接池只有⼀个从属⽂件,tomcat-juli.jar。要想在使⽤ bean 实例化的单⼀项⽬中使⽤池,实例化的 Bean 为
at.jdbc.pool.DataSource。下⽂讲到将连接池配置为 JNDI 资源时会涉及到同⼀属性,也是⽤来将数据源配置成 bean 的。
4. JMX
连接池对象暴露了⼀个可以被注册的 MBean。为了让连接池对象创建 MBean,jmxEnabled 标志必须设为 true。这并不是说连接池会注册到 MBean 服务器。在像 Tomcat 这样的容器中,Tomcat 本⾝注册就在 MBean 服务器上注册了 DataSource。
at.jdbc.pool.DataSource 对象会注册实际的连接池 MBean。如果你在容器外运⾏,可以将 DataSource 注册在任何你指定的对象名下,然后将这种注册传播到底层池。要想这样做,你必须调
⽤ Pool().getJmxPool(),objectname)。在调⽤之前,⼀定要保证通过调
⽤ atePool() 创建了池。
属性
为了能够顺畅地在 Commons DBCP 与 Tomcat JDBC 连接池 之间转换,⼤多数属性名称及其含义都是相同的。
1. JNDI ⼯⼚与类型
属性描述
factory
必需的属性,其值应为 at.jdbc.pool.DataSourceFactory
type
类型应为 javax.sql.DataSource 或 javax.sql.XADataSource。
根据类型,将创建at.jdbc.pool.DataSource 或 at.jdbc.pool.XADataSource。
2. 系统属性
系统属性作⽤于 JVM 范围,影响创建于 JVM 内的所有池。
属性描述
at.lyAttemptCurrentClassLoader
布尔值,默认为 false。控制动态类(如JDBC 驱动、、验证器)的加载。如果采⽤默认值,池会⾸先利⽤当前类加载器(⽐如已经加载池类的类加载器)加载类;如果类加载失败,则尝试利⽤线程上下⽂加载器加载。取值为 true 时,会向后兼容 Apache Tomcat 8.0.8 及更早版本,只会采⽤当前类加载器。如果未设置,则取默认值。
3. 常⽤属性余杭中转站
属性描述
defaultAutoCommit
(布尔值)连接池所创建的连接默认⾃动提交状态。如果未设置,则默认采⽤ JDBC 驱动的缺省值(如果未设置,则不会调
⽤ setAutoCommit ⽅法)。
defaultReadOnly
(布尔值)连接池所创建的连接默认只读状态。如果未设置,将不会调⽤ setReadOnly ⽅法。(有些驱动并不⽀持只读模式,⽐如:informix)
defaultTransactionIsolation
(字符串)连接池所创建的连接的默认事务隔离状态。取值范围为:(参考 javadoc)
NONE
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
如果未设置该值,则不会调⽤任何⽅法,默认为 JDBC 驱动。
defaultCatalog
(字符串)连接池所创建的连接的默认catalog。
driverClassName
(字符串)所要使⽤的 JDBC 驱动的完全限定的 Java 类名。该驱动必须能从与 tomcat-jdbc.jar 同样的类加载器访问
username
(字符串)传⼊ JDBC 驱动以便建⽴连接的连接⽤户名。注意,Connection(username,password)⽅法默认不会使⽤传⼊该⽅法内的凭证,但会使⽤这⾥的配置信息。可参看 alternateUsernameAllowed 了解更多详情。
password
(字符串)传⼊ JDBC 驱动以便建⽴连接的连接密码。注意,Connection(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
(整型值)连接验证失败前的超时时间(以秒计)。通过在执⾏ validationQuery 的语句上调
⽤ java.sql.Statement.setQueryTimeout(seconds) 来实现。池本⾝并不会让查询超时,完全是由 JDBC 来强制实现。若该值⼩于或等于 0,则禁⽤该功能。默认为 -1。
validatorClassName
(字符串)实现 at.jdbc.pool.Validator接⼝并提供了⼀个⽆参(可能是隐式的)构造函数的类名。如果指定该值,将通过该类来创建⼀个 Validator 实例来验证连接,代替任何验证查询。默认为 null,范例值为:pany.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. Tomcat JDBC 增强属性
属性描述
initSQL
字符串值。当连接第⼀次创建时,运⾏的⾃定义查询。默认值为 null。
jdbcInterceptors
字符串。继承⾃类 at.jdbc.pool.JdbcInterceptor的⼦类类名列表,由分号分隔。关于格式及范例,可参见下⽂的配置JDBC 。
这些将会插⼊到 java.sql.Connection 对象的操作队列中。
预定义的有:
at.jdbc.pool.interceptor
ConnectionState——记录⾃动提交、只读、catalog以及事务隔离级别等状态。
诸葛亮北伐at.jdbc.pool.interceptor
StatementFinalizer——记录打开的语句,并当连接返回池后关闭它们。
有关更多预定义的详尽描述,可参阅JDBC
validationInterval
长整型值。为避免过度验证⽽设定的频率时间值(以秒计)。最多以这种频率运⾏验证。如果连接应该进⾏验证,但却没能在此间隔时间内得到验证,则会重新对其进⾏验证。默认为 30000(30 秒)。
jmxEnabled
布尔值。是否利⽤ JMX 注册连接池。默认为 true。
fairQueue
布尔值。假如想⽤真正的 FIFO ⽅式公平对待 getConnection 调⽤,则取值为 true。对空闲连接列表将采
⽤ at.jdbc.pool.FairBlockingQueue 实现。默认值为 true。如果想使⽤异步连接获取功能,则必须使⽤该标志。
设置该标志可保证线程能够按照连接抵达顺序来接收连接。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论