直接貼代碼(這是在網上找的然后改的復制可以運行):
public static void main(String[] args) throws SQLException {
OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser("...");
dataSource.setPassword("....");
dataSource.setURL("jdbc:oracle:thin:@127.0.0.1:1521:Oracle");
final OracleConnection conn = (OracleConnection) dataSource
.getConnection();
Properties prop = new Properties();
prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");// 要取得更改記錄的rowid
prop.setProperty(OracleConnection.NTF_QOS_PURGE_ON_NTFN, "true");
// 設定超時,這里是1個小時,屆時資料庫和驅動器的資源自動釋放。如果為0或不設定,則用不過期,直到程式停止監聽,當資料庫發送更新通知時,因為沒有監聽埠,資料庫隨后釋放資源
prop.setProperty(OracleConnection.NTF_TIMEOUT, "0");
final DatabaseChangeRegistration databaseChangeRegistration = conn
.registerDatabaseChangeNotification(prop);
databaseChangeRegistration.addListener(new DatabaseChangeListener(){
@Override
public void onDatabaseChangeNotification(DatabaseChangeEvent databaseChangeEvent) {
TableChangeDescription[] tds = databaseChangeEvent
.getTableChangeDescription();
long regId = databaseChangeEvent.getRegId();
System.out.println("============================="+ new Date()+ "=============================");
if(regId == databaseChangeRegistration.getRegId()){
System.out.println("'TableChangeDescription'(資料表的變化次數):" + tds.length);
for (TableChangeDescription td : tds) {
System.out.println("資料庫表id:" + td.getObjectNumber());
System.out.println("資料表名稱:" + td.getTableName());
// 獲得回傳的行級變化描述通知 行id、影響這一行的DML操作(行是插入、更新或洗掉的一種)
RowChangeDescription[] rds = td.getRowChangeDescription();
for (RowChangeDescription rd : rds) {
System.out.println("資料庫表行級變化rowid:" + rd.getRowid().stringValue());
System.out.println("資料庫表行級變化:" + rd.getRowOperation().toString());
}
}
}
}
});
OracleStatement statement = (OracleStatement) conn.createStatement();
statement.setDatabaseChangeRegistration(databaseChangeRegistration);
statement.executeQuery("select * from TB_TEST where 1=2");
statement.executeQuery("select * from TB_DEMO where 1=2");
statement.close();
conn.close();
System.err.println("資料庫更改通知開啟:");
}
==================================分割線==========================================
我想請教一下這里可以獲取監聽到操作過的表名,但是顯示是‘???’,這是Oracle的BUG嗎?而且在Oracle12上Oracle直接給取消了。
還有一個他可以獲取顯示操作表的唯一標識(相當于表的Id,注:非你們想的自增主鍵),應該是官網的一個鏈接介紹了這個類,但是沒有太多的介紹,就三個方法,而且那個表的id備注是Oracle內部資訊,是不對外公開嗎?
既然不顯示表名了,那表的唯一id,怎么查看,可以通過查詢陳述句,然后監聽這個陳述句查看表的Id,這是我自己想的,但是Oracle的OJDBC中沒有這個查詢的監聽。
===============================分割線=========================================
關于這個類的介紹太少了,只發現三四篇文章介紹,感覺這個太實用了,不知道是考慮到安全是怎么的,不給完善這個類,而且Oracle后期版本給刪了,不支持了。。。我急切想要這個類,這樣我就可以做實時資料同步了,不用做定時任務了,(不要告訴我有自帶的同步,我是Oracle到Mysql同步,欄位不是很對應)
===============================分割線===============================================
Oracle你在完善一下這個監聽吧,別把他關了。
uj5u.com熱心網友回復:
可以到 Java 區問問,jar 包的他們更專業,要不給你移動過去?uj5u.com熱心網友回復:
移到java模塊去問下轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/82526.html
標籤:高級技術
上一篇:MySQL中使用group by 是總是出現1055的錯誤
下一篇:update mysql row (You can't specify target table 'x' for update in FROM clause)
