【发布时间】:2014-11-18 21:37:46
【问题描述】:
我正在尝试实现一个事件监听器,它可以识别 DATABASE CHANGE NOTIFICATION (Oracle)。根据reference website,它表示当EXAMPLE 表中的某些内容发生变化时,该事件将触发并打印ROW_ID。我希望这个项目运行,它应该给我一个信息“给我一些东西!”如果我在数据库中手动插入/更新数据。但是,据我了解,无论如何,这段代码都会终止,因为没有无限循环可以被事件中断。如果我错了,请纠正我。
其他问题]
通过将 OracleConnection.DCN_NOTIFY_ROWIDS 设置为 true,它将通知每个事件,包括插入、更新、删除。我对么?我对“数据库更改事件将包括行级详细信息,例如操作类型和ROWID”的含义感到困惑
我的代码:
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 DBTest {
static final String USERNAME = "username";
static final String PASSWORD = "password";
static String URL = "jdbc:oracle:thin:@url:port/name";
public static void main(String[] args) {
DBTest oracleDCN = new DBTest();
try {
oracleDCN.run();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void run() throws Exception {
OracleConnection conn = connect();
Properties prop = new Properties();
prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);
try {
dcr.addListener(new DatabaseChangeListener() {
public void onDatabaseChangeNotification(DatabaseChangeEvent dce) {
System.out.println("GIVE ME SOMETHING!");
}
});
//conn.unregisterDatabaseChangeNotification(dcr);
Statement stmt = conn.createStatement();
((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);
ResultSet rs = stmt.executeQuery("select * from Schema.T_TEST");
while (rs.next()) {
}
rs.close();
stmt.close();
} catch (SQLException ex) {
if (conn != null) {
conn.unregisterDatabaseChangeNotification(dcr);
conn.close();
}
throw ex;
}
}
OracleConnection connect() throws SQLException {
OracleDriver dr = new OracleDriver();
Properties prop = new Properties();
prop.setProperty("user", DBTest.USERNAME);
prop.setProperty("password", DBTest.PASSWORD);
return (OracleConnection) dr.connect(DBTest.URL, prop);
}
}
更多详情请见reference website
【问题讨论】:
-
您必须实现 Oracle 连续查询通知功能。链接 (docs.oracle.com/database/121/JJDBC/dbchgnf.htm#JJDBC28815) 为您提供所需的一切。