要想看看拦截器使用方法的具体范例,可以看看 org.apache.tomcat.jdbc.pool.interceptor.ConnectionState。这个简单的拦截器缓存了三个属性:autoCommit、readOnly、transactionIsolation,为的是避免系统与数据库之间无用的往返。
当需求增加时,姜维连接池核心增加更多的拦截器。欢迎贡献你的才智!
拦截器当然并不局限于 java.sql.Connection,当然也可以对方法调用的任何结果进行包装。你可以构建查询性能分析器,以便当查询运行时间超过预期时间时提供 JMX 通知。
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)"
系统会自动忽略属性名称、属性值以及类名前后多余的空格字符。
所有拦截器的抽象基类,无法实例化。
属性 |
描述 |
useEquals |
(布尔值)如果希望 ProxyConnection 类使用 String.equals,则设为 true;当希望在对比方法名时使用 ==,则设为 false。默认为 true。 |
它能为下列属性缓存连接:autoCommit、readOnly、transactionIsolation 及 catalog。这是一种性能增强功能,当利用已设定的值来调用 getter 与 setter 时,它能够避免往返数据库。
跟踪所有使用 createStatement、prepareStatement 或 prepareCall 的语句,当连接返回池后,关闭这些语句。
属性 |
描述 |
trace |
(以字符串形式表示的布尔值)对未关闭语句进行跟踪。当启用跟踪且连接被关闭时,如果相关语句没有关闭,则拦截器会记录所有的堆栈跟踪。默认值为 false。 |
缓存连接中的 PreparedStatement 或 CallableStatement 实例。
它会针对每个连接对这些语句进行缓存,然后计算池中所有连接的整体缓存数,如果缓存数超过了限制 max,就不再对随后的语句进行缓存,而是直接关闭它们。
属性 |
描述 |
prepared |
(以字符串形式表示的布尔值)对使用 prepareStatement 调用创建的 PreparedStatement 实例进行缓存。默认为 true |
callable |
(以字符串形式表示的布尔值)对使用 prepareCall 调用创建的 CallableStatement 实例进行缓存。默认为 false |
max |
(以字符串形式表示的整型值)连接池中的缓存语句的数量限制。默认为 50 |
请参看 48392。拦截器会包装语句和结果集,从而防止对使用了 ResultSet.getStatement().getConnection() 和 Statement.getConnection() 方法的实际连接进行访问。
当新语句创建时,自动调用 java.sql.Statement.setQueryTimeout(seconds)。池本身并不会让查询超时,完全是依靠 JDBC 驱动来强制查询超时。
属性 |
描述 |
queryTimeout |
(以字符串形式表示的整型值)查询超时的毫秒数。默认为 1000 毫秒。 |
当查询超过失败容差值时,记录查询性能并发布日志项目。使用的日志级别为 WARN。
属性 |
描述 |
threshold |
(以字符串形式表示的整型值)查询应超时多少毫秒才发布日志警告。默认为 1000 毫秒 |
maxQueries |
(以字符串形式表示的整型值)为保留内存空间,所能记录的最大查询数量。默认为 1000 |
logSlow |
(以字符串形式表示的布尔值)如果想记录较慢的查询,设为 true。默认为 true |
logFailed |
(以字符串形式表示的布尔值)如果想记录失败查询,设为 true。默认为 true |
这是对 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 来注册对象。 |
当连接签出池中后,废弃计时器即开始计时。这意味着如果超时为 30 秒,而你使用连接运行了 10 个 10秒的查询,那么它就会被标为废弃,并可能依靠 abandonWhenPercentageFull 属性重新声明。每次成功地在连接上执行操作或执行查询时,该拦截器就会重设签出计时器。