在查看我的查询日志时,我看到一个奇怪的模式,我没有解释。
在几乎所有查询之后,我都“从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”(很明显),显然当验证查询非空时,连接池默认testOnBorrow和testOnReturn为true。
这给我带来的另一个问题是,我是否需要来进行验证查询,或者我是否可以通过禁用或至少降低频率来提升性能使用它。不幸的是,编写我们的“数据库管理员”的开发人员不再和我们在一起了,所以我不能要求他为我辩护。任何输入将不胜感激。我将深入挖掘API并谷歌一段时间,如果我找到任何有价值的东西,我会报告。
编辑:添加了更多信息
EDIT2:为以后找到此内容的任何人添加了正确答案中要求的信息
答案 0 :(得分:24)
它可能来自您的应用程序正在使用的连接池。我们使用简单的查询来测试连接。
刚刚在源代码中快速查看了mysql-connector-j,它并非来自那里。
最可能的原因是连接池。
公共连接池:
commons-dbcp 有一个配置属性validationQuery
,这与testOnBorrow
和testOnReturn
相结合可能会导致您看到的陈述。
c3p0 有preferredTestQuery
,testConnectionOnCheckin
,testConnectionOnCheckout
和idleConnectionTestPeriod
对于什么是值得我倾向于配置连接测试和结账/借用,即使这意味着一点额外的网络聊天。
答案 1 :(得分:5)
我已经执行了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
答案 2 :(得分:1)
“双”表/对象名称是Oracle构造,MySQL支持兼容性 - 或者为没有目标的查询提供目标,但人们希望感觉温暖和模糊。 E.g。
select curdate()
可以
select curdate() from dual
有人可能在嗅你,看看你是否在运行Oracle。