当前位置:   article > 正文

JAVA结合Oracle的Database Change Notification实现替代获取实时数据需要的刷库操作_oracle data change notification java

oracle data change notification java
本文的编写目的是建立在这个一个需求基础上:某个系统需要不停的读取数据库中的数据来保证系统中展示的数据为最新的实时数据,并且系统的数据库Oracle10.2以上的版本
Database Change Notification的官方资料可以参考https://docs.oracle.com/cd/E11882_01/java.112/e16548/dbchgnf.htm#JJDBC28815


一、首先我们创建一个表做测试用
  1. create table nj_tmp_tmp(id number, val number);
  2. insert into nj_tmp_tmp values(1,100);
  3. insert into nj_tmp_tmp values(2,200);
  4. insert into nj_tmp_tmp values(3,300);
  5. commit;

二、给操作该表的数据库赋予相应的权限
grant change notification to scott;

此处scott仅作示例用,按照实际用户为准
三、编写相应的java代码


oracle官方给出的步骤


简单的翻译就是第一步创建一个注册器,如下所示
 
DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);

其中conn为OracleConnection的实例对象,prop为一些连接的参数
第二步就是写一个查询表示要监听那些表的修改通知,如下所示
statement.executeQuery("select * from nj_tmp_tmp");

此处表示监听nj_tmp_tmp表
第三步就是注册事件,进行绑定,创建notification来用于响应表或者结果集的变动,Oracle数据库使用JDBC驱动通过一个特定网络来通知java事件
 
  1. dcr.addListener(new DatabaseChangeListener(){
  2. @Override
  3. public void onDatabaseChangeNotification(DatabaseChangeEvent arg0) {
  4. TableChangeDescription[] td=arg0.getTableChangeDescription();
  5. for(TableChangeDescription t:td){
  6. for(RowChangeDescription r:t.getRowChangeDescription()){
  7. ROWID rowid = r.getRowid();
  8. System.out.println("--------"+new String(rowid.getBytes()));
  9. }
  10. }
  11. }
  12. });



接下来上完整代码:代码参考了oracle官网的资料及网络大牛的各种资料,该 代码中仅对插入事件进行监听
  1. public class DBChangeNotification
  2. {
  3. static final String USERNAME= "*****";//数据库用户名
  4. static final String PASSWORD= "*****";//数据库密码
  5. static String URL;
  6. public static void main(String[] argv)
  7. {
  8. URL = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))";
  9. try
  10. {
  11. OracleConnection conn = connect();
  12. Properties prop = new Properties();
  13. prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS,"true");
  14. prop.setProperty(OracleConnection.NTF_TIMEOUT, "0");
  15. prop.setProperty(OracleConnection.DCN_IGNORE_DELETEOP, "true");
  16. prop.setProperty(OracleConnection.DCN_IGNORE_UPDATEOP,"true");
  17. DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);
  18. try
  19. {
  20. dcr.addListener(new DatabaseChangeListener(){
  21. @Override
  22. public void onDatabaseChangeNotification(DatabaseChangeEvent arg0) {
  23. TableChangeDescription[] td=arg0.getTableChangeDescription();
  24. for(TableChangeDescription t:td){
  25. for(RowChangeDescription r:t.getRowChangeDescription()){
  26. ROWID rowid = r.getRowid();
  27. System.out.println("--------"+new String(rowid.getBytes()));
  28. }
  29. }
  30. }
  31. });
  32. Statement stmt = conn.createStatement();
  33. ((OracleStatement)stmt).setDatabaseChangeRegistration(dcr);
  34. ResultSet rs = stmt.executeQuery("select * from nj_tmp_tmp");
  35. String[] tableNames = dcr.getTables();
  36. for(int i=0;i<tableNames.length;i++)
  37. System.out.println(tableNames[i]+" is part of the registration.");
  38. rs.close();
  39. stmt.close();
  40. }
  41. catch(SQLException ex)
  42. {
  43. if(conn != null)
  44. conn.unregisterDatabaseChangeNotification(dcr);
  45. throw ex;
  46. }
  47. finally
  48. {
  49. try
  50. {
  51. conn.close();
  52. }
  53. catch(Exception innerex){ innerex.printStackTrace(); }
  54. }
  55. }
  56. catch(SQLException mainSQLException )
  57. {
  58. mainSQLException.printStackTrace();
  59. }
  60. }
  61. /**
  62. * Creates a connection the database.
  63. */
  64. static OracleConnection connect() throws SQLException
  65. {
  66. OracleDriver dr = new OracleDriver();
  67. Properties prop = new Properties();
  68. prop.setProperty("user",DBChangeNotification.USERNAME);
  69. prop.setProperty("password",DBChangeNotification.PASSWORD);
  70. return (OracleConnection)dr.connect(DBChangeNotification.URL,prop);
  71. }
  72. }










声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码吟游诗人/article/detail/61886
推荐阅读
相关标签
  

闽ICP备14008679号