小编典典

从DUAL中选择1:MySQL

java

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

在几乎每个查询之后,我都有“从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”(很明显),并且当验证查询为非null时,显然连接池默认将testOnBorrow和testOnReturn设置为true。

这给我带来的另一个问题是我是否真的 需要
验证查询,或者是否可以通过禁用它或至少减少使用它的频率来提高性能。不幸的是,写我们的“数据库管理器”的开发人员已经不在我们身边,所以我不能要求他为我辩解。任何输入将不胜感激。我将在API和Google上进行一会儿挖掘,如果发现有任何价值,请向我报告。

编辑:添加了更多信息

EDIT2:添加了正确答案中要求的信息,以便以后找到它的任何人


阅读 209

收藏
2020-11-13

共1个答案

小编典典

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

只是快速浏览了mysql-connector-j的源代码,它并不是从那里来的。

最可能的原因是连接池。

通用连接池:

commons-dbcp
具有配置属性validationQuery,该属性与结合使用testOnBorrowtestOnReturn可能导致您看到的语句。

C3P0
preferredTestQuerytestConnectionOnCheckintestConnectionOnCheckoutidleConnectionTestPeriod

对于什么值,我倾向于配置连接测试和签出/借用,即使这意味着额外的网络闲聊也是如此。

2020-11-13