来自DUAL的SELECT 1:MySQL

在查看我的查询日志时,我看到一个奇怪的模式,我没有解释。

在几乎所有查询之后,我都“从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的连接器的Java-5.1.6-bin.jar

连接池:commons-dbcp 1.2.2

validationQuery被设置为“从DUAL中选择1”(显然),并且当validation查询非空时,显然连接池默认testOnBorrow和testOnReturn为true。

这给我带来的另一个问题是,我是否真的需要validation查询,或者我是否可以通过禁用它或至少降低其使用频率来提高性能。 不幸的是,编写我们的“数据库管理员”的开发人员不再和我们在一起了,所以我不能要求他为我辩护。 任何输入将不胜感激。 我将深入挖掘API并谷歌一段时间,如果我找到任何值得的东西,我会报告。

编辑:添加了一些更多的信息

EDIT2:为以后发现此问题的任何人添加了正确答案中要求的信息

它可能来自您的应用程序正在使用的连接池。 我们使用简单的查询来测试连接。

刚刚在源代码中快速查看了mysql-connector-j,它并非来自那里。

最可能的原因是连接池。

常见连接池:

commons-dbcp有一个配置属性validationQuery ,结合testOnBorrowtestOnReturn可能会导致你看到的语句。

c3p0preferredTestQuerytestConnectionOnCheckintestConnectionOnCheckoutidleConnectionTestPeriod

对于它的价值,我倾向于配置连接测试和结账/借用,即使它意味着一点额外的网络聊天。

我已经执行了100次插入/删除并在DBCP和C3PO上进行了测试。

DBCP :: testOnBorrow = true会将响应时间影响超过4倍。

C3P0 :: testConnectionOnCheckout = true会将响应时间影响超过3倍。

结果如下:DBCP – BasicDataSource

100个事务的平均时间(插入操作)testOnBorrow = false :: 219.01 ms testOnBorrow = true :: 1071.56 ms

100次交易的平均时间(删除操作)testOnBorrow = false :: 223.4 ms testOnBorrow = true :: 1067.51 ms

C3PO – ComboPooledDataSource 100个事务的平均时间(插入操作)testConnectionOnCheckout = false :: 220.08 ms testConnectionOnCheckout = true :: 661.44 ms

100个事务的平均时间(删除操作)testConnectionOnCheckout = false :: 216.52 ms testConnectionOnCheckout = true :: 648.29 ms

结论:在DBCP中设置testOnBorrow = true或在C3PO中设置testConnectionOnCheckout = true会使性能下降3-4倍。 是否有任何其他设置可以提高性能。

-Durga Prasad

“双重”表/对象名称是Oracle构造,MySQL支持兼容性 – 或者为没有目标但人们希望感觉温暖和模糊的查询提供目标。 例如

 select curdate() 

 select curdate() from dual 

有人可能会嗅到你,看看你是否正在运行Oracle。