Tomcat教程

全部教程

×

JDBC连接池高级用法

1. JDBC 拦截器

要想看看拦截器使用方法的具体范例,可以看看 org.apache.tomcat.jdbc.pool.interceptor.ConnectionState。这个简单的拦截器缓存了三个属性:autoCommit、readOnly、transactionIsolation,为的是避免系统与数据库之间无用的往返。

当需求增加时,姜维连接池核心增加更多的拦截器。欢迎贡献你的才智!

拦截器当然并不局限于 java.sql.Connection,当然也可以对方法调用的任何结果进行包装。你可以构建查询性能分析器,以便当查询运行时间超过预期时间时提供 JMX 通知。

2. 配置 JDBC 拦截器

JDBC 拦截器是通过 jdbcInterceptor 属性来配置的。该属性值包含一列由分号分隔的类名。如果这些类名非完全限定,就会在它们的前面加上 org.apache.tomcat.jdbc.pool.interceptor. 前缀。

范例:
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
它实际上等同于:
jdbcInterceptors="ConnectionState;StatementFinalizer"

拦截器也同样有属性。拦截器的属性指定在类名后的括号里,如果设置多个属性,则用逗号分隔开。

范例:

jdbcInterceptors="ConnectionState;StatementFinalizer(useEquals=true)"

系统会自动忽略属性名称、属性值以及类名前后多余的空格字符。

org.apache.tomcat.jdbc.pool.JdbcInterceptor

所有拦截器的抽象基类,无法实例化。

属性

描述

useEquals

(布尔值)如果希望 ProxyConnection 类使用 String.equals,则设为 true;当希望在对比方法名时使用 ==,则设为 false。默认为 true。

org.apache.tomcat.jdbc.pool.interceptor.ConnectionState

它能为下列属性缓存连接:autoCommit、readOnly、transactionIsolation 及 catalog。这是一种性能增强功能,当利用已设定的值来调用 getter 与 setter 时,它能够避免往返数据库。

org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer

跟踪所有使用 createStatement、prepareStatement 或 prepareCall 的语句,当连接返回池后,关闭这些语句。

属性

描述

trace

(以字符串形式表示的布尔值)对未关闭语句进行跟踪。当启用跟踪且连接被关闭时,如果相关语句没有关闭,则拦截器会记录所有的堆栈跟踪。默认值为 false。

org.apache.tomcat.jdbc.pool.interceptor.StatementCache

缓存连接中的 PreparedStatement 或 CallableStatement 实例。

它会针对每个连接对这些语句进行缓存,然后计算池中所有连接的整体缓存数,如果缓存数超过了限制 max,就不再对随后的语句进行缓存,而是直接关闭它们。

属性

描述

prepared

(以字符串形式表示的布尔值)对使用 prepareStatement 调用创建的 PreparedStatement 实例进行缓存。默认为 true

callable

(以字符串形式表示的布尔值)对使用 prepareCall 调用创建的 CallableStatement 实例进行缓存。默认为 false

max

(以字符串形式表示的整型值)连接池中的缓存语句的数量限制。默认为 50

org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor

请参看 48392。拦截器会包装语句和结果集,从而防止对使用了 ResultSet.getStatement().getConnection() 和 Statement.getConnection() 方法的实际连接进行访问。

org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor

当新语句创建时,自动调用 java.sql.Statement.setQueryTimeout(seconds)。池本身并不会让查询超时,完全是依靠 JDBC 驱动来强制查询超时。

属性

描述

queryTimeout

(以字符串形式表示的整型值)查询超时的毫秒数。默认为 1000 毫秒。

org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport

当查询超过失败容差值时,记录查询性能并发布日志项目。使用的日志级别为 WARN。

属性

描述

threshold

(以字符串形式表示的整型值)查询应超时多少毫秒才发布日志警告。默认为 1000 毫秒

maxQueries

(以字符串形式表示的整型值)为保留内存空间,所能记录的最大查询数量。默认为 1000

logSlow

(以字符串形式表示的布尔值)如果想记录较慢的查询,设为 true。默认为 true

logFailed

(以字符串形式表示的布尔值)如果想记录失败查询,设为 true。默认为 true

org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx

这是对 SlowQueryReport 的扩展,除了发布日志项目外,它还发布 JMX 通知,以便监视工具作出相关反应。该类从其父类继承了所有属性。它使用了 Tomcat 的 JMX 引擎,所以在 Tomcat 容器外部是无效的。使用该类时,默认情况下,是通过 ConnectionPool MBean 来发送 JMX 通知。如果 notifyPool=false,则 SlowQueryReportJmx 也可以注册一个 MBean。

属性

描述

notifyPool

(以字符串形式表示的布尔值)如果希望用 SlowQueryReportJmx MBean 发送 JMX 通知,则设为 false。默认为 true

objectName

字符串。定义一个有效的 javax.management.ObjectName 字符串,用于将这一对象注册到平台所用的 mbean 服务器上。默认值为 null。可以使用 tomcat.jdbc:type=org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx,name=the-name-of-the-pool 来注册对象。

org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer

当连接签出池中后,废弃计时器即开始计时。这意味着如果超时为 30 秒,而你使用连接运行了 10 个 10秒的查询,那么它就会被标为废弃,并可能依靠 abandonWhenPercentageFull 属性重新声明。每次成功地在连接上执行操作或执行查询时,该拦截器就会重设签出计时器。