Mam problem przy uruchomieniu oracle database change notification. Niby wszystko działa jednak przy jakiejkolwiek zmianie wiersza, onDatabaseChangeNotification zwraca informacje nie raz jak powinno a tyle razy ile akurat mam wierszy w tabeli. Nie mogę dopatrzeć się dlaczego. Np. mam wiersze w sprawdzanej tabeli:
1 aaa bbb
2 ccc ddd
3 eee ffff
Modyfikuje wiersz 2 z ddd na dddd, spodziewam się jednorazowej informacji:
zmieniono wiersz 2, tymczasem dostaje te informacje 3 razy ponieważ mam 3 wiersze w tabeli.
public 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) {
String affectedRow = dce.getTableChangeDescription()[0].getRowChangeDescription()[0].getRowid().stringValue();
RowOperation ro = dce.getTableChangeDescription()[0].getRowChangeDescription()[0].getRowOperation();
System.out.println("Wiersz: "+affectedRow);
System.out.println("Operacja: "+ro);
}
});
Statement stmt = conn.createStatement();
((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);
ResultSet rs = stmt.executeQuery("select * from ZLECENIA where ID=1");
while (rs.next()) {}
rs.close();
stmt.close();}
catch(SQLException ex){
if (conn != null){
conn.unregisterDatabaseChangeNotification(dcr);
conn.close();}
throw ex;}
}
Rezultat:
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Operacja: UPDATE
Wiersz: AAAFIGAAEAAAAENAAD
Nie wiem dlaczego zwraca to tyle razy