在查看查询日志时,我看到一个没有解释的奇怪模式。
在几乎每个查询之后,我都有“从DUAL中选择1”。
我不知道这是从哪里来的,而且我当然没有明确地进行查询。
日志基本上如下所示:
10 Query SELECT some normal query 10 Query select 1 from DUAL 10 Query SELECT some normal query 10 Query select 1 from DUAL 10 Query SELECT some normal query 10 Query select 1 from DUAL 10 Query SELECT some normal query 10 Query select 1 from DUAL 10 Query SELECT some normal query 10 Query select 1 from DUAL ...etc...
有人遇到过这个问题吗?
MySQL版本:5.0.51
驱动程序:使用JDBC的Java 6应用程序。mysql-connector-java-5.1.6-bin.jar
连接池:commons-dbcp 1.2.2
validationQuery设置为“从DUAL中选择1”(很明显),并且当验证查询为非null时,显然连接池默认将testOnBorrow和testOnReturn设置为true。
这给我带来的另一个问题是我是否真的 需要 验证查询,或者是否可以通过禁用它或至少减少使用它的频率来提高性能。不幸的是,写我们的“数据库管理器”的开发人员已经不在我们身边,所以我不能要求他为我辩解。任何输入将不胜感激。我将在API和Google上进行一会儿挖掘,如果发现有任何价值,请向我报告。
编辑:添加了更多信息
EDIT2:添加了正确答案中要求的信息,以便以后找到它的任何人
它可能来自您的应用程序正在使用的连接池。我们使用一个简单的查询来测试连接。
只是快速浏览了mysql-connector-j的源代码,它并不是从那里来的。
最可能的原因是连接池。
通用连接池:
commons-dbcp 具有配置属性validationQuery,该属性与结合使用testOnBorrow并testOnReturn可能导致您看到的语句。
validationQuery
testOnBorrow
testOnReturn
C3P0 有preferredTestQuery,testConnectionOnCheckin,testConnectionOnCheckout和idleConnectionTestPeriod
preferredTestQuery
testConnectionOnCheckin
testConnectionOnCheckout
idleConnectionTestPeriod
对于什么值,我倾向于配置连接测试和签出/借用,即使这意味着额外的网络闲聊也是如此。