2014-11-20 2 views
0

Я использую объединенный источник данных (базу данных 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();} 

ответ

2

Вы не должны создать новый DataSource для каждого соединения, вам нужно создать только один DataSource и использовать, чтобы получить Connection с. Не забудьте указать close(), поскольку это вернет соединение с пулом.

Вы должны сделать что-то вроде:

// 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); 
    } 
} 
+1

Это намного лучше, чем стендовых предложений. Недостаток nitpick: метод releaseConnection(), который вызван, наконец, не должен включать conn.commit(). Это важно по двум причинам: 1) если в теле метода, вызываемого update(), происходит исключение, работа, скорее всего, будет выполнена только частично, и вы захотите вызвать rollback() [в предложении catch], а не commit(); и 2) если исключение происходит во время conn.commit(), вызов conn.close() будет пропущен, что потенциально предотвратит возврат Connections в пул. –

+1

Если вам требуется транзакционное поведение, вызовите conn.setAutoCommit (false) в верхней части блока try, выполните свою работу и вызовите conn.commit() в нижней части блока try. поместите conn.rollback() в предложение catch и conn.close() в конце. –

+0

После добавления 'throws Exception' не следует использовать' return cpds' тип ComboPooledDatasource вместо Datasource ?? Я получаю ошибку компиляции там. @ Steve Waldman: conn.rollback() не требуется, так как это односторонняя транзакция, но если я захочу включить его позже: если я вызову rollback(), не отменит ли он все изменения, сделанные даже теми, которые были выполнены до вызывается stUpload.executebatch()? –

Смежные вопросы