13

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

在几乎每个查询之后,我都有“从 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-connector-java-5.1.6-bin.jar

连接池:commons-dbcp 1.2.2

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

这给我带来的另一个问题是我是否真的需要验证查询,或者我是否可以通过禁用它或至少降低使用它的频率来提高性能。不幸的是,编写我们的“数据库管理器”的开发人员已不在我们身边,所以我不能要求他为我证明这一点。任何输入将不胜感激。我将通过 API 和谷歌挖掘一段时间,如果我发现任何有价值的东西,我会报告。

编辑:添加了更多信息

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

4

3 回答 3

24

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

只是快速查看了 mysql-connector-j 的源代码,它不是来自那里。

最可能的原因是连接池。

常见的连接池:

commons-dbcp有一个配置属性,它与您看到的语句validationQuery结合testOnBorrow并可能导致。testOnReturn

c3p0preferredTestQuery, testConnectionOnCheckin,testConnectionOnCheckoutidleConnectionTestPeriod

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

于 2009-05-27T20:47:58.503 回答
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 倍。是否有任何其他设置可以提高性能。

——杜尔加·普拉萨德

于 2010-02-18T11:20:45.260 回答
2

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

select curdate()

select curdate() from dual

有人可能会嗅探您是否正在运行 Oracle。

于 2009-05-27T20:48:59.877 回答