JDBC 使用 C3P0 时 SQLite ATTACH 查询

JDBC SQLite ATTACH Query while using C3P0

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

我真的需要将 ATTACH 测试作为 TESTDB 交错用于每个查询吗???

运行 遇到与 MariaDB 的 setCatalog() 类似的问题。在第一个之后的每个后续查询中,我都会得到一个 "No Database selected"。

Do I really need to interlace ATTACH test as TESTDB for EVERY query???

没有。正如@MarkRotteveel 在对该问题的评论中所建议的那样,我们可以使用 c3p0 connection customizer 来调整每个连接,因为它是为池获取的。例如,如果我们创建 class 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