来自DUAL的SELECT 1:MySQL

big*_*mus 12 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...
Run Code Online (Sandbox Code Playgroud)

以前有人遇到过这个问题吗?

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:为以后发现此问题的任何人添加了正确答案中要求的信息

Gar*_*vis 24

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

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

最可能的原因是连接池.

公共连接池:

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

C3P0preferredTestQuery,testConnectionOnCheckin,testConnectionOnCheckoutidleConnectionTestPeriod

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

  • 如果您没有进行某种排序验证,通常会发生的情况是数据库连接超时过夜而早上的第一次X登录失败,因为它们有过时的连接.commons-dbcp有testWhileIdle这将在另一个线程中运行验证查询,并且时序是可配置的.正如我上面所说,我只是将它留在testOnBorrow上,直到你真正推动网络/硬件的性能极限 (2认同)

小智 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