在《
Tomcat中使用Connector/J連接MySQL的超時問題》帖子中想要增加對連接池中連接的測試/驗證,防止數據庫認為連接已死而Web應用服務器認為連接還有效的問題,Mysql文檔中提到Tomcat文檔中的例子中用的是validationQuery,但是網上還有很多帖子寫的是testQuery,到底用哪一個呢?
原來這跟連接池的實現有關:
| 連接池實現 | 該功能屬性名 |
|---|---|
| The Tomcat JDBC Connection Pool | validationQuery |
| The Apache Commons DBCP Connection Pool | validationQuery |
| c3p0 - JDBC3 Connection and Statement Pooling | preferredTestQuery |
| Atomikos:Tomcat Spring ActiveMQ MySQL JMX Integration 分析Atomikos數據連接池源碼,弄清testQuery |
testQuery |
此外,測試/驗證連接池連接的SQL語句也因數據庫而異:
Efficient SQL test query or validation query that will work across all (or most) databases
DBCP - validationQuery for different Databases
綜合上述兩個帖子,匯總結果如下:
| 數據庫 | 測試/驗證查詢 |
|---|---|
| MySQL | SELECT 1 |
| PostgreSQL | SELECT 1 |
| Microsoft SQL Server | SELECT 1 |
| SQLite | SELECT 1 |
| H2 | SELECT 1 |
| Ingres | SELECT 1 |
| Oracle | select 1 from dual |
| DB2 | select 1 from sysibm.sysdummy1 或 SELECT current date FROM sysibm.sysdummy1 |
| Apache Derby | VALUES 1 FROM SYSIBM.SYSDUMMY1 或 SELECT 1 FROM SYSIBM.SYSDUMMY1 |
| HSQLDB | SELECT 1 FROM any_existing_table WHERE 1=0 或 SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS |
| Informix | select count(*) from systables |
