Первый раз пытаетесь сделать что-то подобное, и я не уверен, что мне не хватает?
Мой код:
package SQLOCpackage;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dcn.DatabaseChangeEvent;
import oracle.jdbc.dcn.DatabaseChangeListener;
import oracle.jdbc.dcn.DatabaseChangeRegistration;
import oracle.jdbc.dcn.RowChangeDescription;
import oracle.jdbc.dcn.TableChangeDescription;
@SuppressWarnings("serial")
public class SQLONframe extends JFrame {
String URL = "jdbc:oracle:thin:@xxxxx.xxxxx.xx.xxxx:1521:xxxxx";
Properties prop;
private JPanel contentPane;
static String PW = "xxxxxxxx";
static String UN = "xxxxxxxx";
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SQLONframe frame = new SQLONframe();
frame.setVisible(true);
SQLONframe dcn = new SQLONframe();
try {
dcn.prop = new Properties();
dcn.prop.setProperty("user", UN);
dcn.prop.setProperty("password", PW);
dcn.run();
}
catch(Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public SQLONframe() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
}
void run() throws SQLException {
OracleConnection conn = (OracleConnection)DriverManager.getConnection(URL,prop);
DatabaseChangeRegistration dcr = null;
Properties prop = new Properties();
prop.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");
try {
dcr = conn.registerDatabaseChangeNotification(prop);
dcnListener list = new dcnListener(this);
dcr.addListener(list);
Statement stmt = conn.createStatement();
((OracleStatement)stmt).setDatabaseChangeRegistration(dcr);
ResultSet rs = stmt.executeQuery("select script_name, current_status, Issues_found_during_run, Testers, tools from ALLDATA WHERE ID = 1");
while (rs.next())
{
}
String[] tableNames = dcr.getTables();
for(int i=0;i<tableNames.length;i++)
System.out.println(tableNames[i]+" is part of the registration.");
rs.close();
stmt.close();
}
catch(Exception e) {
//clean up our registration
if(conn != null)
conn.unregisterDatabaseChangeNotification(dcr);
e.printStackTrace();
}
finally {
try {
conn.close();
}
catch(Exception e){
e.printStackTrace();
}
}
try {
Thread.currentThread().join();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
OracleConnection conn3 = (OracleConnection)DriverManager.getConnection(URL,prop);
conn3.unregisterDatabaseChangeNotification(dcr);
conn3.close();
}
}
class dcnListener implements DatabaseChangeListener {
SQLONframe dcn;
dcnListener(SQLONframe dem) {
dcn = dem;
}
public void onDatabaseChangeNotification(DatabaseChangeEvent e) {
TableChangeDescription[] tc = e.getTableChangeDescription();
for (int i = 0; i < tc.length; i++) {
RowChangeDescription[] rcds = tc[i].getRowChangeDescription();
for (int j = 0; j < rcds.length; j++) {
System.out.println(rcds[j].getRowOperation() + " " + rcds[j].getRowid().stringValue());
}
}
synchronized( dcn ){
dcn.notify();
}
}
}
}
Я вижу, что он регистрирует уведомление об изменениино когда я иду и изменяю что-то в этой таблице и фиксирую это, я никогда не получаю ничего со стороны кода, говорящего, что что-то изменилось?
Любая помощь будет отличной!
update
Использование
SELECT * from USER_CHANGE_NOTIFICATION_REGS
Я получаю регистрацию при выполнении этого запроса в SQL Developer:
И информация о версии ojdbc8.jar:
Oracle 18.3.0.0.0 JDBC 4.2, скомпилированный с javac 1.8.0_171 в
Tue_Jun_26_11: 06: 40_PDT_2018
Ресурс свойств соединения по умолчанию
Вт 12 марта 10:06:48 EDT 2019
, и это состояние Oracle SQL Developer:
OracleБаза данных 12c Enterprise Edition, выпуск 12.2.0.1.0 - 64-разрядная версия
PL / SQL Release 12.2.0.1.0 - версия
"CORE12.2.0.1.0 Производство "
TNS для Linux: Версия 12.2.0.1.0 - Производство
NLSRTL Версия 12.2.0.1.0 - Производство
ис моей запущенной программой и зарегистрированным запросом вот что я вижу для портов: