1

我将 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 库中......我对吗?

4

0 回答 0