我将 Oracle Universal Connection Pool 用于 DataSource 和 Spring JdbcTemplate。FE:
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”文本),只有在代码完成后(“Finished.”文本)才会释放锁。如果我从代码中删除注释(所以 - 切换到 autoCommit=false 模式)一切都会好的。
我认为这是 JdbcTemplate 中的一个错误。或者在 Oracle 12.1.0.2 ucp 库中......我对吗?