来自DUAL的SELECT 1:MySQL

时间:2009-05-27 20:42:47

标签: java mysql connection-pooling apache-commons-dbcp

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

在几乎所有查询之后,我都“从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:为以后找到此内容的任何人添加了正确答案中要求的信息

3 个答案:

答案 0 :(得分:24)

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

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

最可能的原因是连接池。

公共连接池:

commons-dbcp 有一个配置属性validationQuery,这与testOnBorrowtestOnReturn相结合可能会导致您看到的陈述。

c3p0 preferredTestQuerytestConnectionOnCheckintestConnectionOnCheckoutidleConnectionTestPeriod

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

答案 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。