我正在注册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过程以接收通知,则通知是即时的。
我有什么选择来减少间隔?我的目标是瞬间或每隔几秒钟。
答案 0 :(得分:0)
提交文档表明应该编写任何挂起的更改并将其提交给db。
所以我的猜测是,在调用commit()之前的15分钟内还有一些不属于上述片段的内容。你可以测试一下。
潜在的解决方法(如果问题不是由于持久性框架级别的延迟而被识别为oracle驱动程序或等效的问题),则将直接调用该过程。