Oracle数据库更改通知仅每15分钟发送一次

时间:2016-01-26 17:44:03

标签: java oracle jdbc oracle11g eclipselink

我正在注册Oracle数据库更改通知的监听器(使用JPA的EclipseLink实现,Oracle 11.2.0.3,Oracle JDBC瘦驱动程序11.2.0.4):

        entityManager.getTransaction().begin(); // otherwise we cannot unwrap the Connection from the entityManager
        Properties properties = new Properties();
        DatabaseChangeRegistration databaseChangeRegistration = ((OracleConnection)entityManager.unwrap(Connection.class)).registerDatabaseChangeNotification(properties);
        databaseChangeRegistration.addListener(this);

        //now you need to add whatever tables you want to monitor
        try (Statement stmt = entityManager.unwrap(Connection.class).createStatement()) {
            //associate the statement with the registration:
            ((OracleStatement) stmt).setDatabaseChangeRegistration(databaseChangeRegistration); //look up the documentation to this method [http://docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OracleStatement.html#setDatabaseChangeRegistration_oracle_jdbc_dcn_DatabaseChangeRegistration_]
            try (ResultSet rs = stmt.executeQuery("SELECT * FROM MY_MONITORED_TABLE WHERE ROWNUM=1")) { //you have to execute the query to link it to the statement for it to be monitored
                while (rs.next()) {
                    //..do sth with the results if interested...
                }
            }
        }
        entityManager.getTransaction().commit();

我收到通知,但所有这些都是每15分钟一次。无论何时开始收听,15分钟都是基于绝对时间的。似乎发送通知的作业仅在服务器上以15分钟的固定间隔运行。

如果我直接在服务器上注册PL / SQL过程以接收通知,则通知是即时的。

我有什么选择来减少间隔?我的目标是瞬间或每隔几秒钟。

1 个答案:

答案 0 :(得分:0)

提交文档表明应该编写任何挂起的更改并将其提交给db。

所以我的猜测是,在调用commit()之前的15分钟内还有一些不属于上述片段的内容。你可以测试一下。

潜在的解决方法(如果问题不是由于持久性框架级别的延迟而被识别为oracle驱动程序或等效的问题),则将直接调用该过程。