public static void main(String[] args) throws SQLException {
String tableName = "表名";
OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser("数据库名");
dataSource.setPassword("数据库密码");
dataSource.setURL("jdbc:oracle:thin:@ip:1521:orcl");
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("数据表名称:" + tableName);
// 获得返回的行级变化描述通知 行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 " + tableName + " where 1=2");
statement.close();
System.err.println("数据库更改通知开启:");
}
java代码监听oracle数据库数据变化
于 2022-11-01 09:22:59 首次发布