Запрос JDBC SQLite ATTACH при использовании C3P0
Недавно я внедрил C3P0 в своей программе тестирования баз данных (я использую его для тестирования разных запросов к нашим данным в разных форматах БД... sqlite, mariadb и т. Д.). Программа была изначально настроена с использованием единого постоянного соединения для выполнения всех запросов. Это работало нормально с SQLite, так как я должен был выполнить начальный ATTACH для другой таблицы. При переходе к C3P0, где необходимо открывать и закрывать соединение по каждому запросу, как можно выполнить команду ATTACH и применить ее к последующим запросам? В моем отказе я заметил, что первый запрос после присоединения, казалось, применился.
Мне действительно нужно чередовать ATTACH-тест как TESTDB для КАЖДОГО запроса???
Столкнувшись с аналогичной проблемой с setCatalog() для MariaDB. Я получаю "База данных не выбрана" для каждого последующего запроса после первого.
1 ответ
Мне действительно нужно чередовать ATTACH-тест как TESTDB для КАЖДОГО запроса???
Нет. Как @MarkRotteveel предложил в комментарии к вопросу, мы можем использовать настройщик соединений c3p0, чтобы настроить каждое соединение, когда оно получено для пула. Например, если мы создаем класс OurSQLiteConnectionCustomizer
...
package com.example.sqlite_pooled;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.AbstractConnectionCustomizer;
public class OurSQLiteConnectionCustomizer extends AbstractConnectionCustomizer {
public void onAcquire(Connection c, String pdsIdt) throws SQLException {
try (Statement st = c.createStatement()) {
st.execute("ATTACH DATABASE 'C:/__tmp/SQLite/test.sqlite' AS test");
}
}
}
... и мы говорим нашим ComboPooledDataSource
использовать это...
cpds = new ComboPooledDataSource();
cpds.setConnectionCustomizerClassName("com.example.sqlite_pooled.OurSQLiteConnectionCustomizer");
... тогда, когда c3p0 получает новое соединение SQLite для пула, он автоматически выполняет ATTACH DATABASE
для нас.