我最近在我的数据库测试程序中实现了C3P0(我用它来测试不同数据库格式的数据的不同查询... sqlite,mariadb等)。该程序最初使用单个持续连接进行设置以执行所有查询。这对SQLite很好,因为我必须在另一个表上进行初始ATTACH。当移动到需要在每个查询上打开和关闭连接的C3P0时,如何发出ATTACH命令并将其应用于后续查询?在我的失败中,我注意到附加后的第一个查询似乎适用。
我是否真的需要将ATTACH测试交错为TESTDB以进行每次查询???
与MariaDB的setCatalog()遇到类似的问题。我得到了一个"没有选择数据库"对于第一个之后的每个后续查询。
答案 0 :(得分:2)
我是否真的需要将ATTACH测试交错为TESTDB以进行每次查询???
没有。正如@MarkRotteveel在对该问题的评论中建议的那样,我们可以使用c3p0 connection customizer来调整每个连接,因为它是为池获取的。例如,如果我们创建类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
。