• 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数据库才能知道是谁注册的

  • 相关阅读:
    JDBC之——一个单线程JDBC基类和一些注意事项
    java基础之——类的初始化顺序
    java线程之——synchronized的注意细节
    java线程之——sleep()与wait()的区别
    mysql view(视图)
    select的5中子句where,group by, havaing, order by, limit的使用顺序及实例
    Django的文件下载
    Django中图片的上传并显示
    Django中 基于form的注册,基于ajax的登录
    centos7 安装zabbix3.4
  • 原文地址:https://www.cnblogs.com/wang3680/p/7161131.html
Copyright © 2020-2023  润新知