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
。
我最近在我的数据库测试程序中实现了 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
。