我正在使用Oracle通用连接池获取DataSource和Spring JdbcTemplate。 F.E:
public class JdbcLock {
private static final Logger logger = LoggerFactory.getLogger(JdbcLock.class);
public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
PoolDataSource poolDataSource = PoolDataSourceFactory.getPoolDataSource();
poolDataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
poolDataSource.setURL("jdbc:oracle:thin:@ldap://oraldap:389/dbtame,cn=OracleContext,dc=n,dc=b,dc=r");
poolDataSource.setUser("user");
poolDataSource.setPassword("password");
poolDataSource.setMaxPoolSize(8);
JdbcTemplate jdbcTemplate = new JdbcTemplate(poolDataSource);
jdbcTemplate.execute (
(ConnectionCallback<Object>) conn -> {
try (PreparedStatement psttm = conn.prepareStatement("select def from tab1 where id = 1 for update")) {
// boolean isAutoCommit = conn.getAutoCommit();
// if (isAutoCommit) {
// conn.setAutoCommit(false);
// }
psttm.setQueryTimeout(15);
try (ResultSet rset = psttm.executeQuery()) {
if (rset.next()) {
logger.info("Locked.");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.error("InterruptedException", e);
}
}
} finally {
// conn.commit();
// if (isAutoCommit) {
// conn.setAutoCommit(true);
// }
}
} catch (SQLTimeoutException sqte) {
logger.error("ops1", sqte);
}
return null;
}
);
logger.info("UnLocked.");
Thread.sleep(5000);
logger.info("Finished.");
}
}
主要想法 - 我有一行锁更新。如果我从2个不同的进程执行此操作,则在完成jdbcTemplate.execute方法(“UnLocked”文本)之后,只有在代码完成(“完成”。文本)之后才会释放锁。 如果我从代码中删除注释(所以 - 切换到autoCommit = false模式)一切都会好的。
我认为这是JdbcTemplate中的一个错误。或者在Oracle 12.1.0.2 ucp库中...... 我是对还是不对?