java - 使用 C3P0 时的 JDBC SQLite ATTACH 查询

标签 java sqlite jdbc c3p0

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

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

MariaDB 的 setCatalog() 遇到类似的问题。对于第一个查询之后的每个后续查询,我都会收到“未选择数据库”。

最佳答案

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

没有。正如 @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

关于java - 使用 C3P0 时的 JDBC SQLite ATTACH 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45924693/

相关文章:

Android SQLite "BETWEEN"不包含或返回所有记录

java - Android - 如何使用表创建 Sqlite 数据库

java - 在 while(resultSet.next()) 循环中调用 JComboBox#addItem() 最终只有 1 个项目

Java 堆内存错误

c# - 如何在不按 Ctrl + C 的情况下将任何应用程序中的选定文本获取到 VB.NET

java - JAR 文件的 Proguard 混淆

java - 如何按顺序延迟更改按钮颜色

java - OnTouchEvent 在 Android 中无法正常工作

javascript - SQLite - SUM 返回 null 而不是 0(零)值

java - 如何使用 JDBC 和 MySQL 使正在读取的行等待,直到释放该行上的锁?