Универсальный запрос SELECT для тестирования подключения

Наши приложения работают с 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 не является допустимым запросом для SQL Server, если мы не создаем объект DUAL.

Очень простой вопрос: есть ли какой-либо запрос SELECT или просто безвредный, который можно повсеместно использовать на всех платформах для проверки возможности подключения?

Я могу переопределить базу данных .preferredTestQuery в файле свойств для инсталляций Oracle, но мне все еще интересно, существует ли жизнеспособное универсальное решение.

[Изменить] Проверка соединения выполняется C3P0 независимо от моего кода. Когда запрос завершается с ошибкой (если включено ведение журнала отладки), он записывает ошибку в журналы. Ни один мой код не использует этот запрос, он является частью конфигурации C3P0, потому что объект сам проверяет установление соединения или нет (как я понимаю). Тогда я не могу этого сделать. В настоящее время было возможно переопределить этот запрос для установок Oracle только с помощью конфигураций.

И, кстати, даже если бы я мог тестировать реализацию диалекта через код, вопрос можно было бы перефразировать как "Чтобы проверить подключение, могу ли я запустить универсальный запрос или сделать должен запускать безобидный запрос, специфичный для СУБД?" или что-то в этом роде

Ответ 1

безобидный запрос, который можно повсеместно использовать на всех платформах для проверки возможности подключения?

Чтобы просто протестировать связь? Я думаю, что ваш SELECT * FROM DUAL должен быть хорошо во всех трех базах данных для проверки возможности подключения. В SQL Server вы получите сообщение об ошибке Недопустимое имя объектa > .. Это означает, что вы подключены к базе данных, и она вернула ошибку, говоря, что таблица не существует.

Поскольку, если вы не подключены, вы получите другую ошибку, а не стандартный стек ошибок для таблицы не существует.

К счастью, если в SQL Server создается таблица с именем dual, это будет хорошо и полезно.

Но мне интересно, насколько сложно иметь условие IF-ELSE в вашем коде, чтобы проверить соединение с базой данных и иметь разные запросы для разных баз данных.

Я думаю, что большинство приложений, которые используют несколько продуктов базы данных в бэкэнд, имеют определенное свойство для проверки соединения.

Ответ 2

Вы можете попробовать использовать тернарный оператор в Spring файле конфигурации, как описано здесь, или попробовать чистую конфигурацию Java, чем применить свою логику для тестирования БД с помощью соответствующий запрос на основе поставщика базы данных.

Надежда помогла вам!