Database Change Notification

使用java监控oracle数据库的变化,主要是针对表数据,如果发生变化,使用select去查询,能够达到推送的目的

 1 package com.test.notifi;
 2 
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 import java.sql.Statement;
 6 import java.util.Properties;
 7 import oracle.jdbc.OracleConnection;
 8 import oracle.jdbc.OracleDriver;
 9 import oracle.jdbc.OracleStatement;
10 import oracle.jdbc.dcn.DatabaseChangeEvent;
11 import oracle.jdbc.dcn.DatabaseChangeListener;
12 import oracle.jdbc.dcn.DatabaseChangeRegistration;
13 import oracle.jdbc.pool.OracleDataSource;
14 
15 public class TestNotification {
16 
17     public void run(){
18         OracleDataSource dataSource;
19         try {
20             dataSource = new OracleDataSource();
21                dataSource.setUser("hw");
22                 dataSource.setPassword("112311");
23                 dataSource.setURL("jdbc:oracle:thin:@198.22.1.4:1521:COPYDB1");
24                  OracleConnection conn = (OracleConnection) dataSource.getConnection();
25                  
26                  Properties prop = new Properties();
27                  prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS,"true");
28                  prop.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");
29                  DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);
30                  
31                  DCNDemoListener list = new DCNDemoListener(this);
32                  dcr.addListener(list);
33                  
34                  Statement stmt = conn.createStatement();
35                  
36                  ((OracleStatement)stmt).setDatabaseChangeRegistration(dcr);
37 //                  ResultSet rs = stmt.executeQuery("select * from hs_secu.entrust a where a.fund_account = '610005385'");
38                   ResultSet rs = stmt.executeQuery("select * from stocc");
39                   while (rs.next())
40                   {}
41                   String[] tableNames = dcr.getTables();
42                   for(int i=0;i<tableNames.length;i++)
43                     System.out.println(tableNames[i]+" is part of the registration.");
44                   rs.close();
45                   stmt.close();
46                   conn.close();
47         } catch (SQLException e) {
48             // TODO Auto-generated catch block
49             e.printStackTrace();
50             
51         }
52     }
53     
54     public static void main(String[] a) {
55             TestNotification notification = new TestNotification();
56             notification.run();
57 }
58     
59 }
 1 package com.test.notifi;
 2 
 3 import oracle.jdbc.dcn.DatabaseChangeEvent;
 4 import oracle.jdbc.dcn.DatabaseChangeListener;
 5 
 6 class DCNDemoListener implements DatabaseChangeListener
 7 {
 8   TestNotification demo;
 9   DCNDemoListener(TestNotification dem)
10   {
11     demo = dem;
12   }
13   public void onDatabaseChangeNotification(DatabaseChangeEvent e)
14   {
15     Thread t = Thread.currentThread();
16     System.out.println("DCNDemoListener: got an event ("+this+" running on thread "+t+")");
17     System.out.println(e.toString());
18     synchronized( demo ){ demo.notify();}
19   }
20 }

使用windows机器去运行这个程序的时候,请注意,hostname需要添加自己的IP和主机名称

例如:  198.28.1.2 TIM-PC

这样oracle数据库才能知道是谁注册的

原文地址:https://www.cnblogs.com/wang3680/p/7161131.html