В мою базу данных Oracle я зарегистрировал DatabaseChangeNotification
с SQL-Query. Мне нравится получать какие-либо изменения в определенном TABLE
.
DatabaseChangeRegistration changeRegistration;
Properties properties = new Properties();
properties.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
properties.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION, "true")
changeRegistration = connection.registerDatabaseChangeNotification(properties);
DCNListener dcnListener = new DCNListener(this);
changeRegistration.addListener(this);
Statement statement = connection.createStatement();
((OracleStatement) statement).setDatabaseChangeRegistration(changeRegistration);
String sql = "SELECT * from TABLE";
statement.executeQuery(sql);
В моем слушателе я получаю DatabaseChangeEvents
public void onDatabaseChangeNotification(DatabaseChangeEvent databaseChangeEvent) {
TableChangeDescription[] tableChangeDescription = databaseChangeEvent.getTableChangeDescription();
QueryChangeDescription[] queryChangeDescription = databaseChangeEvent.getQueryChangeDescription();
for (QueryChangeDescription qcd: queryChangeDescription) {
String result = qcd.toString();
System.out.println(qcd);
}
}
tabelChangeDescription
- nullquery ID = 201, тип события изменения запроса = QUERYCHANGE Таблица Изменение Описание (length = 1): operation = [UPDATE], tableName = USER.TABLE, objectNumber = 67385 Row Change Description (length = 1): ROW: operation = UPDATE, ROWID = AAAQc5AAHAAAAG/AAB
Есть ли хороший способ получить ROWID из строки "Изменения", кроме String-Parsing? Я не могу найти getRowId
-Method в QueryChangeDescription
.
Я нашел, что должен был получить RowId. Из queryChangeDescription
вы можете получить TabeleChangeDesciptions
который не имеет ничего общего с TableChangeDecription от события. Если в более чем одной таблице есть изменения, эти таблицы перечислены в массиве. Поскольку я зарегистрирован только для одной таблицы, мне не нужно перебирать список.
После использования TableChangeDescription
вы можете получить RowChangeDescription
для каждой измененной строки. Из этого вы можете получить RowId.
for (QueryChangeDescription queryChangeDescription : databaseChangeEvent.getQueryChangeDescription()) {
RowChangeDescription[] rowChangeDescriptions = queryChangeDescription.getTableChangeDescription()[0].getRowChangeDescription();
for (RowChangeDescription rowChangeDescription : rowChangeDescriptions) {
handleEvent(rowChangeDescription.getRowid());
}
}
queryChangeDescription.getTableChangeDescription()[0]
Не удается найти методgetTableChangeDescription()
Пожалуйста, помогите!