日期:2014-05-16  浏览次数:20574 次

Java实时获取oracle变更
http://www.iteye.com/topic/267893


在一个基于数据库的“实时系统”里面,“实时”获取数据库变化是非常重要的,本文主要描述通过Oracle中的捕获进程实时获取数据库变化。

背景:

       要做一个车辆GPS监控系统,主要分两块:

    1.采集。由GPS厂商提供实时数据,通过UDP包接收
    2.展示。前端程序获取到最新GPS数据后,在地图上模拟车辆的运行情况
      

备选方案:

     1.采集程序接收到UDP包并解析后,将数据放入数据库;前端程序轮询数据库以获取最新数据。
     2.采集程序接收到UDP包并解析后,将数据放入数据库,同时向前端程序发送一条消息,传递最新数据。

方案评估:



    方案1:最简单,最传统;增加不必要的数据库查询,并且非实时,轮询时间间隔不好确定。

    方案2:可实现“实时”,但增加采集程序职责,采集程序本不知道前端系统的存在。



最终方案:



    最后采取了另一种方案:通过oracle捕获进程捕获数据库变更(采集程序insert或update一条记录时,捕获进程即时获取到该条记录),将变更记录发送到AQ(oracle高级队列,JMS的oracle实现),前端程序只关注AQ,当有新消息到来时,即刻可收到并做相应处理,反映出实时状态。

    关于捕获进程,请参考《Streams概述》,《Streams捕获进程》



实现:



  

SQL代码


    创建表空间和用户:

   




Sql代码 
1.Create tablespace streams_tbs datafile 'E:\DBSERVER\ORACLE9I\ORADATA\TESTDB\stream_tbs.dbf' size 25M Reuse autoextend on maxsize unlimited; 
2. 
3.--修改目标表(要捕获变更的表)追加日志 
4.ALTER TABLE myoracle.TEST_GPS_STATUS ADD SUPPLEMENTAL LOG GROUP log_group_gpsstatus_pk (DEVICEID) ALWAYS; 
5. 
6. 
7.create user strmadmin identified by strmadmin default tablespace streams_tbs quota unlimited on streams_tbs; 
8. 
9. 
10.grant connect, resource, select_catalog_role to strmadmin; 




授予相应权限




Sql代码 
1.grant execute on dbms_aqadm to strmadmin; 
2. 
3.grant execute on dbms_capture_adm to strmadmin; 
4. 
5.grant execute on dbms_propagation_adm to strmadmin; 
6. 
7.grant execute on dbms_streams_adm to strmadmin; 
8. 
9.grant execute on dbms_apply_adm to strmadmin; 
10. 
11.grant execute on dbms_flashback to strmadmin; 
12. 
13.grant execute on dbms_aq to strmadmin; 
14. 
15.grant execute on dbms_aqjms to strmadmin; 
16. 
17.grant execute on dbms_aqin to strmadmin; 
18. 
19.grant execute on dbms_aqjms_internal to strmadmin; 
20.  



执行系统存储过程分配权限


   



Sql代码 
1.BEGIN 
2.DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE( 
3.privilege => DBMS_RULE_ADM.CREATE_RULE_SET_OBJ, 
4.grantee => 'strmadmin', 
5.grant_option => FALSE); 
6.END; 
7./ 
8. 
9. 
10. 
11.BEGIN 
12.DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE( 
13.privilege => DBMS_RULE_ADM.CREATE_RULE_OBJ, 
14.grantee => 'strmadmin', 
15.grant_option => FALSE); 
16.END; 
17./ 
18.  





以strmadmin帐户登录oracle




创建AQ,类型为JMS消息






Sql代码 
1.BEGIN 
2.   DBMS_AQADM.CREATE_QUEUE_TABLE( 
3.        Queue_table            => 'gpsstatus_queue_table', 
4.        Queue_payload_type     => 'SYS.AQ$_JMS_MESSAGE', 
5.        multiple_consumers  => false, 
6.