java - 从 DUAL : MySQL 中选择 1

标签 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-connector-java-5.1.6-bin.jar

连接池:commons-dbcp 1.2.2

validationQuery 设置为“select 1 from DUAL”(很明显),显然当验证查询为非空时,连接池默认将 testOnBorrow 和 testOnReturn 设置为 true。

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

编辑:添加了更多信息

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

最佳答案

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

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

最可能的原因是连接池。

常用连接池:

commons-dbcp 有一个配置属性 validationQuery,这结合 testOnBorrowtestOnReturn 可能会导致语句你看。

c3p0preferredTestQuerytestConnectionOnCheckintestConnectionOnCheckoutidleConnectionTestPeriod

我倾向于配置连接测试和结帐/借用,即使这意味着一些额外的网络聊天,这有什么值(value)。

关于java - 从 DUAL : MySQL 中选择 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917927/

相关文章:

java - 不同的对象,同名变量应该有两个不同的值,但不是吗?

java - Android Studio 中的动态 ListView : Selecting random element and update list view

java - 如何让代码模块化?

php - 使用 URL 突出显示表格行

mysql - MySQL 不支持哪些 SQL Server 查询语法?

java - 为同一网络上连接的一组系统创建公共(public)数据库连接

java - Tomcat连接池方法

java - 如何为java中的字符串数组变量添加双引号("")

MYSQL - 选择每条记录的最近日期(相关子查询)

java - Tomcat JDBC 异常池耗尽