Java c3p0 CombopooledDataSource未提交SQL更新

Java c3p0 CombopooledDataSource未提交SQL更新,java,sql,c3p0,Java,Sql,C3p0,我正在使用一个池数据源(msaccess数据库)通过我制作的应用程序更新本地数据库(客户端使用h2数据库)。 我遇到的问题是,当提交请求时,比如“插入用户(名称、代码)值(Me,hfd5255fd4);”应用程序运行正常,错误日志中没有报告任何内容,但数据库中也没有任何更改。 我使用的代码如下 private static Connection getDatabase() throws Exception { cpds.setDriverClass("net.ucanaccess.j

我正在使用一个池数据源(msaccess数据库)通过我制作的应用程序更新本地数据库(客户端使用h2数据库)。 我遇到的问题是,当提交请求时,比如“插入用户(名称、代码)值(Me,hfd5255fd4);”应用程序运行正常,错误日志中没有报告任何内容,但数据库中也没有任何更改。 我使用的代码如下

private static Connection getDatabase() throws Exception {


    cpds.setDriverClass("net.ucanaccess.jdbc.UcanaccessDriver");
    // loads the jdbc driver
    cpds.setJdbcUrl("jdbc:ucanaccess://"
            + (new File("Ressources/filter.mdb").getAbsolutePath()));
    cpds.setUser("admin");
    cpds.setPassword("ibnsina");
    cpds.setAutoCommitOnClose(false);
 return cpds.getConnection(); //tried removing this , but no effect
}
----doing some other stuff---
private static updating() throws exception{
conn = getDatabase();

    File fileUpload = new File(logPath + "UploadLog.txt");
    BufferedReader readerUpload = new BufferedReader(new FileReader(
            fileUpload));
    String Uploadingline = "";
    StringBuffer secondaryline = new StringBuffer();
    if (readerUpload.ready()) {
        System.out.println("Uploadtxt ready");
        Statement stUpload = conn.createStatement();
        System.out.println("Stupload ready");
        while ((Uploadingline = readerUpload.readLine()) != null) {

            if (Uploadingline.endsWith(";")) {
                secondaryline.append(Uploadingline);
                /*stUpload.executeUpdate(secondaryline.toString()); tried this to execute each line separatly*/
                stUpload.addBatch(secondaryline.toString());
                System.out.println("Reading line :" + secondaryline);
                secondaryline.setLength(0);

            } else {
                secondaryline.append(Uploadingline);

            }

        }
        stUpload.executeBatch();
        stUpload.clearBatch();
        conn.commit(); //i even tried adding this to make it commit even tho autocommit is by default ON
        stUpload.close();}

您不应该为每个连接创建一个新的
数据源
,您只需要创建一个
数据源
,并使用它来获得
连接
s。请记住
关闭()
它们,因为这将返回到池的连接

你应该这样做:

// There should only ever be one of these.
private static final DataSource ds = makeDataSource();

private static DataSource makeDataSource() {
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass("net.ucanaccess.jdbc.UcanaccessDriver");
    // loads the jdbc driver
    cpds.setJdbcUrl("jdbc:ucanaccess://"
            + (new File("Ressources/filter.mdb").getAbsolutePath()));
    cpds.setUser("admin");
    cpds.setPassword("ibnsina");
    cpds.setAutoCommitOnClose(false);
    return cpds;
}

private static Connection getConnection () {
    return ds.getConnection();
}

private static void releaseConnection (Connection conn) {
    conn.commit();
    conn.close();
}

private static void updating() {
    Connection conn = getConnection();
    try {
        //...
    } finally {
        releaseConnection(conn);
    }
}

这比海报上的好多了。一个次要的挑剔:从finally调用的releaseConnection()方法不应该包括conn.commit()。这一点很重要,有两个原因:1)如果在调用update()的方法体中发生异常,工作可能只完成了一部分,并且您希望调用rollback()[在catch子句中]而不是commit();2)如果在conn.commit()期间发生异常,将跳过对conn.close()的调用,这可能会阻止连接返回池。如果需要事务性行为,请在try块顶部调用conn.setAutoCommit(false),然后执行工作,并在try块底部调用conn.commit()。将conn.rollback()放在catch子句中,将conn.close()放在finally子句中。添加
后抛出异常
返回CPD类型不应该是ComboPooledDatasource而不是Datasource??我在那里遇到一个编译错误。@Steve Waldman:conn.rollback()不是必需的,因为它是一个单向事务,但是如果我以后想包含它:如果我调用rollback(),它会不会取消所有更改,即使是在调用stUpload.executebatch()之前所做的更改?@SteveWaldman-我同意-我这样发布,因为OP的代码是在关闭时提交的。这样做确实是一种潜在的气味。@RahmouneMedEl habib-在这种情况下,您现在知道您的问题不是使用ComboPooledDatasource。我建议你检查一下你的问题。