Java c3p0 CombopooledDataSource未提交SQL更新
我正在使用一个池数据源(msaccess数据库)通过我制作的应用程序更新本地数据库(客户端使用h2数据库)。 我遇到的问题是,当提交请求时,比如“插入用户(名称、代码)值(Me,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
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。我建议你检查一下你的问题。