2015-04-01 1 views
1

Вызов готовогоStatement.executeUpdate() возвращается успешно (с количеством обновленных строк). Но БД не отражает обновление. Увидев эту проблему с помощью ojdbc7.jar (попробовал как java 7, так и java 8 SE).PreparedStatement executeUpdate в соединении OracleDataSource не выполняет автоматическое совершение

final String UPDATE_SQL = "UPDATE myPortfolio SET stock = ? WHERE key = ?"; 
    final String stock = 'SO';// pre ipo :) 
    final long key = 12345l; 

    try (Connection conn = pds.getConnection(); PreparedStatement proc = conn.prepareStatement(UPDATE_SQL)) { 
     //conn.setAutoCommit(false); --> this works 
     conn.setAutoCommit(true); // this is the default...but making sure 
     proc.setString(1, stock); 
     proc.setLong(2, key); 
     int rowcount = proc.executeUpdate(); 
     //conn.commit(); --> this works 

     logger.info("Updated {} rows. SQL = {}. stock = {}, key = {}, InboundKey = {}", rowcount, UPDATE_SQL, stock, key); 
     // logs 1 row updated. But DB still shows stale data (old stock) for key 12345l. 
    } catch (SQLException E) { 
     throw new PersistenceException(E); 
    } 

    // Pool data source settings 
    PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource(); 
    pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); 
    pds.setConnectionPoolName(cacheName); 
    pds.setURL(dbUrl); 
    pds.setUser(username); 
    pds.setPassword(password); 

    pds.setMinPoolSize(5); 
    pds.setMaxPoolSize(10); 
    pds.setInitialPoolSize(7); 
    pds.setInactiveConnectionTimeout(10); 
+2

Либо вызовите 'conn.commit()', либо включите опцию 'autoCommit'. – Brandon

+0

@Brandon, у меня есть conn.setAutoCommit (true). что еще нужно сделать, чтобы включить автоматическую фиксацию? – frostbite

+0

О, я этого не видел. Я не знаком с «PoolDataSource». Это похоже на библиотеку пула соединений Oracle. Я не могу найти настройки автосохранения на уровне пула. Я действительно не уверен. – Brandon

ответ

0

Если вы используете executeUpdate() или выполнить(), то вам нужно сделать connection.commit(). И если вы не хотите выполнять коммит, то вы можете пойти для: prepareStatement() не требует commit().

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