来自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
,结合testOnBorrow
和testOnReturn
可能会导致你看到的语句。
c3p0有preferredTestQuery
, testConnectionOnCheckin
, testConnectionOnCheckout
和idleConnectionTestPeriod
对于它的价值,我倾向于配置连接测试和结账/借用,即使它意味着一点额外的网络聊天。
我已经执行了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。