постоянные уведомления об изменении базы данных

Вопрос:

Мне нужно отслеживать таблицу oracle для изменений, и я пытаюсь выбрать между Database Change Notifications и Advanced Queuing.

Я не понимаю некоторые моменты в Руководстве для разработчиков баз данных JDBC и getDatabaseChangeRegistration javadoc

Если я зарегистрирую регистрацию изменения БД (DCR) с флагом NTF_QOS_RELIABLE, я ожидаю, что уведомления будут сохраняться, пока приложение jdbc не работает. Тем не менее, я не вижу способа восстановить существующий DCR после перезагрузки моего приложения: согласно javadoc, getDatabaseChangeRegistration() предназначен только для слушателей PLSQL. И похоже, что DCD файлы jdbc уничтожаются, когда мое приложение умирает, и мне даже не нужно их отменить.

После перезагрузки моей программы я иногда получаю уведомления с предыдущим идентификатором регистрации. Нет необходимости вызывать stmt.setDatabaseChangeRegistration() каждый раз, когда я запускаю свое приложение.

Я никогда не получаю изменений, которые произошли во время моего приложения, и это самая большая проблема. Что делает NTF_QOS_RELIABLE?

package org.foo;

import static oracle.jdbc.OracleConnection.*;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.Locale;
import java.util.Properties;

import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dcn.DatabaseChangeEvent;
import oracle.jdbc.dcn.DatabaseChangeListener;
import oracle.jdbc.dcn.DatabaseChangeRegistration;

// CHECKSTYLE.OFF: Name|Reg
public final class TestDbListener {

private TestDbListener() {}

public static void main(final String[] args) throws Exception {
Locale.setDefault(Locale.US);

Class.forName("oracle.jdbc.OracleDriver");
final OracleConnection conn =
(OracleConnection) DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.56.150:1521:xe", "scott", "tiger");

final Properties props = new Properties();
props.setProperty(NTF_QOS_RELIABLE, "true");

final DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(props);
final DCNListener list = new DCNListener();
dcr.addListener(list);

if (true) {

// now you need to add whatever tables you want to monitor
final OracleStatement stmt = (OracleStatement) conn.createStatement();
// associate the statement with the registration:
stmt.setDatabaseChangeRegistration(dcr);

final String sql = "select * from a where 1=2";
final ResultSet rs = stmt.executeQuery(sql);

}

final String[] tableNames = dcr.getTables();
for (int i = 0; i < tableNames.length; i++) {
System.out.println(tableNames[i] + " has been registered.");
}

Thread.sleep(1000000);

// rs.close();

}

}

class DCNListener implements DatabaseChangeListener {

@Override
public void onDatabaseChangeNotification(final DatabaseChangeEvent event) {
System.out.println("onDatabaseChangeNotification: " + event);
}
}

SQL:

-- sysdba:
-- grant change notification to scott;

-- scott:
create table a ( a int );

insert into a values ( 1 );
commit;

Лучший ответ:

NTF_QOS_RELIABLE может использоваться для управления типом очереди на сервере для обработки уведомлений. См. Этот документ: https://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci10new.htm#CHDFCCJE

О NTF_QOS_RELIABLE:

Выжившие экземпляры Oracle RAC могут использоваться для отправки и получения уведомлений о непрерывном запросе сообщений даже после сбоя узла, поскольку недействительности, связанные с этой регистрацией, постоянно ставятся в очередь в базу данных. Если FALSE, то недействительности помещаются в очередь в очередь быстрого хранения. Обратите внимание, что этот параметр описывает постоянство уведомлений, а не постоянство регистрации. По умолчанию регистрация автоматически сохраняется.

Если приложение умирает, предполагается, что во время перезагрузки вы получите последние данные из таблицы, которую вы хотите контролировать. Поэтому уведомления, которые были отправлены между сбоем и перезагрузкой, не нужны.

Обратите внимание, что после перезапуска требуется вызвать conn.registerDatabaseChangeNotification чтобы перезапустить прослушиватель драйверов.

Оцените статью
TechArks.Ru
Добавить комментарий