代码之家  ›  专栏  ›  技术社区  ›  biggusjimmus

从dual:mysql中选择1

  •  12
  • biggusjimmus  · 技术社区  · 16 年前

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

    在几乎每次查询之后,我都会“从双选项中选择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

    validation query被设置为“从dual中选择1”(显然),并且当验证查询非空时,显然连接池默认testonborrow和testonreturn为true。

    这给我带来的另一个问题是,我是否真的 需要 要进行验证查询,或者我是否可以通过禁用它来提高性能,或者至少降低使用它的频率。不幸的是,编写“数据库管理器”的开发人员已经不在我们身边了,所以我不能让他为我辩护。如有任何意见,我们将不胜感激。我会在api和google中挖掘一段时间,如果我发现有什么值得做的,我会报告的。

    编辑:添加了更多信息

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

    3 回复  |  直到 14 年前
        1
  •  24
  •   Gareth Davis    16 年前

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

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

    最可能的原因是连接池。

    公用连接池:

    共享数据库 具有配置属性 validationQuery ,这与 testOnBorrow testOnReturn 可能导致你看到的陈述。

    C3P0 preferredTestQuery , testConnectionOnCheckin , testConnectionOnCheckout idleConnectionTestPeriod

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

        2
  •  5
  •   Durga Prasad    15 年前

    我已经执行了100个插入/删除操作,并在dbcp和c3po上进行了测试。

    dbcp::testonborrow=true对响应时间的影响超过4倍。

    c3p0::testconconnectioncheckout=true影响响应时间超过3倍。

    结果如下: “基本数据源”

    100个事务的平均时间(插入操作) testonborrow=false::219.01毫秒 testonborrow=真::1071.56毫秒

    100个事务的平均时间(删除操作) testonborrow=false::223.4毫秒 testonborrow=真::1067.51毫秒

    c3po_ 100个事务的平均时间(插入操作) testconnectioncheckout=false::220.08毫秒 testconnectioncheckout=真::661.44毫秒

    100个事务的平均时间(删除操作) testconnectioncheckout=false::216.52毫秒 testconnectioncheckout=真::648.29毫秒

    Concurlsion:在dbcp中设置testonborrow=true或在c3po中设置testconcheckout=true会将性能影响3-4倍。是否有其他可以提高性能的设置。

    - Durga Prasad

        3
  •  1
  •   Cody Caughlan    16 年前

    “dual”表/对象名是一个Oracle结构,MySQL支持它的兼容性,或者为没有目标但人们希望有目标的查询提供一个目标。例如。

    select curdate()
    

    可以是

    select curdate() from dual
    

    可能有人在嗅探你,看你是否在运行Oracle。