Я использую объединенный источник данных (базу данных msaccess) для обновления локальной базы данных (клиентской стороны с использованием базы данных h2) с помощью приложения, которое я сделал. Проблема заключается в отправке запроса: «ВСТАВЬТЕ ПОЛЬЗОВАТЕЛЕЙ (НАЗВАНИЕ, КОД) ЗНАЧЕНИЯ (Me, hfd5255fd4
); приложение работает отлично, ничего не сообщается в журнале ошибок, но ничего не изменилось и в базе данных. код я использую следующим образомc3p0 CombopooledDataSource не выполняет обновление SQL
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();}
Это намного лучше, чем стендовых предложений. Недостаток nitpick: метод releaseConnection(), который вызван, наконец, не должен включать conn.commit(). Это важно по двум причинам: 1) если в теле метода, вызываемого update(), происходит исключение, работа, скорее всего, будет выполнена только частично, и вы захотите вызвать rollback() [в предложении catch], а не commit(); и 2) если исключение происходит во время conn.commit(), вызов conn.close() будет пропущен, что потенциально предотвратит возврат Connections в пул. –
Если вам требуется транзакционное поведение, вызовите conn.setAutoCommit (false) в верхней части блока try, выполните свою работу и вызовите conn.commit() в нижней части блока try. поместите conn.rollback() в предложение catch и conn.close() в конце. –
После добавления 'throws Exception' не следует использовать' return cpds' тип ComboPooledDatasource вместо Datasource ?? Я получаю ошибку компиляции там. @ Steve Waldman: conn.rollback() не требуется, так как это односторонняя транзакция, но если я захочу включить его позже: если я вызову rollback(), не отменит ли он все изменения, сделанные даже теми, которые были выполнены до вызывается stUpload.executebatch()? –