使用C3P0时JDBC SQLite ATTACH查询

时间:2017-08-28 17:46:47

标签: java sqlite jdbc c3p0

我最近在我的数据库测试程序中实现了C3P0(我用它来测试不同数据库格式的数据的不同查询... sqlite,mariadb等)。该程序最初使用单个持续连接进行设置以执行所有查询。这对SQLite很好,因为我必须在另一个表上进行初始ATTACH。当移动到需要在每个查询上打开和关闭连接的C3P0时,如何发出ATTACH命令并将其应用于后续查询?在我的失败中,我注意到附加后的第一个查询似乎适用。

我是否真的需要将ATTACH测试交错为TESTDB以进行每次查询???

与MariaDB的setCatalog()遇到类似的问题。我得到了一个"没有选择数据库"对于第一个之后的每个后续查询。

1 个答案:

答案 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