用于测试连接的通用SELECT查询

时间:2015-04-23 09:14:15

标签: mysql sql sql-server oracle

我们的应用程序可与MySQL,MS SQL Server和Oracle DB一起使用。

我们的C3P0配置使用preferredTestQuery选项来测试连接。这是我们的Spring配置

<b:bean id="phoenixDataSource" 
               class="com.mchange.v2.c3p0.ComboPooledDataSource"
               destroy-method="close">

            <b:property name="driverClass" value="${database.driver}"/>
            <b:property name="jdbcUrl" value="${database.connectionURL}"/>
            <b:property name="user" value="${database.user}"/>
            <b:property name="password" value="${database.password}"/>

            <b:property name="initialPoolSize"><b:value>${database.initialPoolSize:10}</b:value></b:property>
            <b:property name="minPoolSize"><b:value>${database.minPoolSize:1}</b:value></b:property>
            <b:property name="maxPoolSize"><b:value>${database.maxPoolSize:25}</b:value></b:property>
            <b:property name="acquireRetryAttempts"><b:value>${database.acquireRetryAttempts:10}</b:value></b:property>
            <b:property name="acquireIncrement"><b:value>${database.acquireIncrement:5}</b:value></b:property>
            <b:property name="idleConnectionTestPeriod"><b:value>${database.idleConnectionTestPeriod:60}</b:value></b:property>
            <b:property name="maxIdleTime"><b:value>${database.maxIdleTime:10800}</b:value></b:property>
            <b:property name="maxConnectionAge"><b:value>${database.maxConnectionAge:14400}</b:value></b:property>
            <b:property name="preferredTestQuery"><b:value>${database.preferredTestQuery:SELECT 1}</b:value></b:property>
            <b:property name="testConnectionOnCheckin"><b:value>${database.testConnectionOnCheckin:false}</b:value></b:property>
            <b:property name="testConnectionOnCheckout"><b:value>${database.testConnectionOnCheckout:false}</b:value></b:property>

        </b:bean>

SELECT 1对Oracle没有有效查询,但除非我们创建SELECT 1 FROM DUAL对象,否则DUAL对SQL Server无效。

非常简单的问题:是否有任何SELECT或仅无害查询可以在所有平台上普遍用于测试连接?

我可以在Oracle安装的属性文件中覆盖database.preferredTestQuery,但我仍然想知道是否有可行的通用解决方案。

[编辑]连接检查由C3P0独立于我的代码进行。当查询失败时(如果启用了调试日志记录),它会在日志中写入错误。我的代码没有使用该查询,它是C3P0配置的一部分,因为该工具自行检查是否建立了连接(因为这是我的理解)。我不能,如果 - 否则那么。目前,仅通过配置覆盖Oracle安装的查询是可行的。

顺便说一句,即使我能够通过代码对方言实现进行测试,问题也可以改为&#34;为了测试连接性,我可以运行通用查询或者我是否必须运行特定于DBMS的无害查询?&#34;或类似的东西

2 个答案:

答案 0 :(得分:2)

  

无害查询可以在所有平台上普遍使用以测试连接性吗?

只测试连接?我认为你的SELECT * FROM DUAL在所有三个数据库中应该没问题来测试连接性。在SQL Server中,您会收到错误无效的对象名称'dual'。。这意味着您已连接到数据库,并返回错误,表示该表不存在。

因为,如果你没有连接,你会得到一个不同的错误而不是表的标准错误堆栈不存在。

幸运的是,如果在SQL Server中创建了一个名为dual的表,那将会很好。

但是我想知道,在代码中有一个IF-ELSE条件来检查数据库连接并对不同的数据库有不同的查询是多么困难。

我认为大多数在后端使用多个数据库产品的应用程序都定义了一些属性来检查连接。

答案 1 :(得分:1)

您可以按照here的说明在Spring配置文件上尝试三元运算符,或者尝试使用纯Java配置,而不是将您的逻辑应用于基于数据库提供程序的适当查询来测试数据库。

希望帮助你!