要想看看攔截器使用方法的具體范例,可以看看 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??梢允褂?nbsp;tomcat.jdbc:type=org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx,name=the-name-of-the-pool 來注冊對象。 |
當連接簽出池中后,廢棄計時器即開始計時。這意味著如果超時為 30 秒,而你使用連接運行了 10 個 10秒的查詢,那么它就會被標為廢棄,并可能依靠 abandonWhenPercentageFull 屬性重新聲明。每次成功地在連接上執行操作或執行查詢時,該攔截器就會重設簽出計時器。