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

usr*_*ΛΩΝ 11 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>
Run Code Online (Sandbox Code Playgroud)

SELECT 1对于Oracle没有有效查询,但SELECT 1 FROM DUAL除非我们创建DUAL对象,否则它不是SQL Server的有效查询.

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

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

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

顺便说一句,即使我可以通过代码测试方言实现,问题也可以改为"为了测试连接性,我可以运行通用查询,还是必须运行特定于DBMS?" 或类似的东西

小智 1

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

希望对你有帮助!