我在我的maven项目中使用ojdbc8 12.2.0.1,我想通知表中是否有新条目。 我使用的是ojdbc7 11.2.0.1和oracle 11g,在此方面,它工作正常。 现在,我要升级到使用ojdbc8 12.2.0.1 jar的oracle 12c。
如我所见,该表正在进入user_change_notification_regs表,但是一旦已注册表中有新条目,则已注册表将被取消注册。 这意味着user_change_notification_regs表中没有条目。
代码未提供任何类型的异常或错误。
任何替代DCN的方法也有帮助。
代码:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dcn.DatabaseChangeEvent;
import oracle.jdbc.dcn.Databasechangelistener;
import oracle.jdbc.dcn.DatabaseChangeRegistration;
public class DBChangeNotification {
public static void main(String[] argv) {
try {
Connection con = DriverManager.getconnection(url,user,password);
startDcn(con);
} catch (SQLException mainSQLException) {
mainSQLException.printStackTrace();
}
}
public static void startDcn(Connection conn) throws SQLException {
Properties prop = new Properties();
prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS,"true");
prop.setProperty(OracleConnection.DCN_IGNORE_DELETEOP,"true");
prop.setProperty(OracleConnection.DCN_IGNORE_UPDATEOP,"true");
DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);
//listener not getting called as table getting unregistered.
dcr.addListener(new Databasechangelistener() {
public void onDatabaseChangeNotification(DatabaseChangeEvent dce) {
RowChangeDescription[] rowChangeDescription = dce.getTableChangeDescription()[0].getRowChangeDescription();
for (RowChangeDescription rcd: rowChangeDescription) {
System.out.print("Working"); //not getting print
}
}
});
Statement stmt = conn.createStatement();
((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);
ResultSet rs = stmt.executeQuery("select * from demo where rownum='1' ");
while (rs.next()) {}
String[] tableNames = dcr.getTables();
for (int i = 0; i < tableNames.length; i++)
System.out.println(tableNames[i] + " is part of the registration.");
rs.close();
stmt.close();
}
catch (SQLException ex) {
ex.printStackTrace();
}
}
注意:请忽略语法错误(如果有)。