它看起来像JdbcTemplate autoCommit模式中的一个错误

时间:2016-09-20 17:00:17

标签: oracle jdbc jdbctemplate autocommit rowlocking

我正在使用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库中...... 我是对还是不对?

0 个答案:

没有答案