[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] Track Database modifications.
|
> I forgot to mention that the doc. attached to the original message that
> describes DbChangeNotification technique using triggers - unfortunately
> it's no longer on Oracle site, fortunately Google cached it.
>
Thanks for the answer, but this is not exactly what I want. I only need to
know who do the change and what did he change. Also, I need an eclipselink
only solution (im using Derby to develop a DB2 to deploy).
I read something about History Policy, but de documentation is small. someone
can clarify that?
> On 8/20/2010 4:29 PM, Andrei Ilitchev wrote:
> > You can use triggers in Oracle db that would send JMS messages (using
> > AQ) which Eclipselink-using application could receive and invalidate
> > the altered object - that will cause Eclipselink next time the object
> > is accessed directly to refresh it from the db.
> > Example of implementing this strategy could be found in
> > eclipselink.extension.oracle.test\src\org\eclipse\persistence\testing\tes
> > ts\dbchangenotification - though it would not run standalone, but only in
> > TestingBrowser (Eclipselink testing framework).
> >
> > Moreover, Google search for DbChangeNotification brought
> > http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_dcn.
> > htm -
> > apparently there is a (relatively new) feature in Oracle jdbc driver
> > for that.
> > I didn't investigate in any depth, but at the first glance it seems
> > similar to the above mentioned technique.
> >
> > Good luck,
> > Andrei
> >
> > On 8/20/2010 3:41 PM, José Arcángel Salazar Delgado wrote:
> >> Hello folks.
> >>
> >> What is the best way to track Database modifications with eclipselink?
> >>
> >> thanks for the help.
> >>
> >>
> >> ------------------------------------------------------------------------
> >>
> >> _______________________________________________
> >> eclipselink-users mailing list
> >> eclipselink-users@xxxxxxxxxxx
> >> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >
> > ------------------------------------------------------------------------
> >
> > Subject:
> > Database Change Notification and TopLink Cache Invalidation How-To
> > Document
> > From:
> > <Saved by Windows Internet Explorer 8>
> > Date:
> > Fri, 20 Aug 2010 16:13:29 -0400
> >
> >
> > This is Google's cache of
> > http://www.oracle.com/technology/products/ias/toplink/technical/tips/DbCh
> > angeNotification/index.htm. It is a snapshot of the page as it appeared
> > on Aug 3, 2010 22:11:00 GMT. The current page
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/DbC
> > hangeNotification/index.htm> could have changed in the meantime. Learn
> > more
> > <http://www.google.com/intl/en/help/features_list.html#cached>
> >
> > Text-only version
> > <http://webcache.googleusercontent.com/search?q=cache:PaXfY6MWyRUJ:www.or
> > acle.com/technology/products/ias/toplink/technical/tips/DbChangeNotificat
> > ion/index.htm+TopLink+DbChangeNotification&hl=en&gl=us&strip=1> These
> > search terms are highlighted: toplink These terms only appear in links
> > pointing to this page: dbchangenotification
> >
> > Database Change Notification and *TopLink* Cache Invalidation
> >
> > How-To Document
> >
> > January 2006
> >
> > After reading this How-To document, you will be able to:
> > *
> >
> > Implement database change notification.
> >
> > *
> >
> > Implement *TopLink* application cache invalidation.
> >
> > Software Requirements
> >
> > *
> >
> > Oracle Database 10g, or higher.
> >
> > *
> >
> > Oracle *TopLink* 10g Release 3 (10.1.3), available from OTN
> > <http://www.oracle.com/technology/software/products/ias/index.html>
> > .
> >
> > *
> >
> > The Java source code
> > <http://www.oracle.com/technology/products/ias/toplink/technical/ti
> > ps/DbChangeNotification/CacheInvalidator.zip> for the *TopLink*
> > Cache Invalidation component.
> >
> > Conventions
> >
> > The following conventions are used in this document:
> > *
> >
> > |<ORACLE_HOME>| -- the directory in which you installed *TopLink*.
> >
> > Introduction
> >
> > This How-To document provides information on a *TopLink* stale data
> > problem and a two-part solution to address the stale data problem.
> >
> > *TopLink* Stale Data Problem
> >
> > A common procedure among database applications is to cache data during
> > application operation. Sometimes, this can result in some cached
> > application data becoming stale as another application may change the
> > data in the database, thus rendering the cached data obsolete. This
> > could happen without the cached application knowing about it.
> >
> > This How-To document provides an outline of the required setup
> > procedures using the *TopLink* Employee example to illustrate.
> >
> > Database Change Notification and Application Cache Invalidation
> > Solution
> >
> > A simple two-part solution can be used to minimize, and in some cases
> >
> > eliminate, occurrences of the stale data problem as follows:
> > *
> >
> > Database change notification: whereby the database notifies
> > applications about changed data.
> >
> > *
> >
> > Application cache invalidation: whereby the notified application
> > marks the corresponding cached data as invalid. This signals to
> > the application that the data needs to be re-read into the
> > cached application from the database.
> >
> > Guidelines to which a proper database change notification solution
> >
> > should adhere include:
> > *
> >
> > The method of providing notification should not be
> > application-dependent and should allow for multiple applications
> > to use it simultaneously.
> >
> > *
> >
> > Notification should be transaction-based: this implies that the
> > notification is not issued until the change to the database is
> > committed.
> >
> > *
> >
> > Some applications, including *TopLink* use the cache not only to
> > store existing database data, but also to write new data into
> > the database. It is necessary for applications with write
> > capability to have an option not to be notified of database
> > changes caused by its write operations.
> >
> > Note:
> >
> > If notification messages are sent too frequently, the performance of
> > the database and notified application(s) operation may be severely
> > degraded.
> >
> > Notification and *TopLink* Cache Invalidation Solution
> >
> > This section provides information on database change notification and
> > *TopLink* cache invalidation solution.
> >
> > Database Change Notification
> >
> > Oracle Database 10g and subsequent versions use triggers and Java
> > Message Service (JMS) messaging implemented by Oracle Advanced Queuing
> >
> > (AQ) as follows:
> > *
> >
> > On update or deletion of a database row, a trigger creates a
> > message that contains the name of the table and the row's
> > primary key value(s) and places the message into the queue.
> >
> > *
> >
> > After a transaction is committed to the database, the
> > corresponding JMS message is delivered to all subscribers
> > (applications).
> >
> >
> > *TopLink* Cache Invalidation
> >
> > An application enabled by *TopLink* extracts the table name and the
> > primary key value(s) from the JMS message and invalidates the
> > corresponding object in the *TopLink* cache. Note that *TopLink* 10g
> > Release 3 (10.1.3) or higher is required.
> >
> > Database Setup
> >
> > This section provides setup information for the Oracle database Users,
> > Advanced Queue, and Triggers.
> >
> > Users
> >
> > *
> >
> > User |dbuser| contains the tables that will send change
> > notification messages.
> >
> > *
> >
> > An application that initiated a database change should not
> > receive notification of this change. One method of enforcing
> > this is to have different applications use different user names.
> > For example, |app1|, |app2|,.... The different user names would
> > not use their default schemas but would access the |dbuser|
> > schema instead.
> >
> > *
> >
> > User |aqadm| contains the queue through which notification
> > messages are sent.
> >
> > The following procedure assumes that the |dbuser| user already exists
> > and that the *TopLink* Employee example is set up and populated in its
> > default schema.
> >
> > 1.
> >
> > Connect as a DBA:
> >
> > CONNECT SYSTEM/MANAGER
> >
> > 2.
> >
> > Enable the |dbuser| to enqueue (send) the messages into any queue:
> >
> > EXEC DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(privilege =>
> > ENQUEUE_ANY',grantee
> >
> > => 'dbuser',admin_option => FALSE);
> >
> > 3.
> >
> > Allow the |dbuser| to call the enqueue method in PL/SQL:
> >
> > GRANT AQ_USER_ROLE, EXECUTE ON DBMS_AQ TO dbuser;
> >
> > 4.
> >
> > Create the |app| user:
> >
> > CREATE USER app IDENTIFIED BY password DEFAULT TABLESPACE users
> > TEMPORARY
> >
> > TABLESPACE temp;
> >
> > 5.
> >
> > Grant the |app| user access to all database objects in |dbuser|
> > schema:
> >
> > GRANT SELECT, INSERT, UPDATE, DELETE ON dbuser.address to app;
> > ...
> >
> > 6.
> >
> > Enable the |app| user to dequeue (receive) the messages from any
> > queue:
> >
> > EXEC DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(privilege => 'DEQUEUE_ANY',
> >
> > grantee => 'app', admin_option => FALSE);
> >
> > 7.
> >
> > Allow the |app| user to dequeue JMS messages in a Java application:
> >
> > GRANT AQ_USER_ROLE, EXECUTE ON DBMS_AQIN, EXECUTE ON DBMS_AQJMS TO
> > app;
> >
> > 8.
> >
> > Create |aqadm| - the user to own the queue:
> >
> > CREATE USER aqadm IDENTIFIED BY password DEFAULT TABLESPACE users
> >
> > TEMPORARY TABLESPACE temp;
> >
> > GRANT CONNECT,RESOURCE,AQ_ADMINISTRATOR_ROLE TO aqadm;
> >
> >
> >
> >
> > Advanced Queue
> >
> > The |notify_queue| allows for multiple consumers (applications that
> > receive messages) and sends Oracle's implementations of JMS messages.
> >
> > 1.
> >
> > Connect as a queue owner:
> >
> > CONNECT aqadm/aqadm
> >
> > 2.
> >
> > Create and start the queue:
> >
> > EXEC DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table =>
> > 'notify_queue_table',
> >
> > multiple_consumers => TRUE, queue payload_type =>
> > 'SYQ.AQ$_JMS_TEXT_ MESSAGE');
> >
> > EXEC DBMS_AQADM.CREATE_QUEUE (queue_name =>
> > 'notify_queue',queue_table =>
> >
> > 'notify_queue_table');
> >
> > EXEC DBMS_AQADM.START_QUEUE (queue_name => 'notify_queue');
> >
> > Alternatively, if there is only a single application to be notified,
> > the queue table may be created with |multiple_consumers=>FALSE|.
> >
> > Triggers
> >
> > A trigger is created for each table that will send one or more
> > notification messages. You can create two helper functions first to
> > simplify the trigger code.
> >
> > 1.
> >
> > Connect as a *TopLink* user of the schema where the *TopLink*
> > Employee example is set up:
> >
> > CONNECT dbuser/dbuser
> >
> > 2.
> >
> > Create the |notify_make_msg| function provided. This function
> > creates the message and populates it with the application ID
> > (|app1|, |app2|, ... found in |USER|) and the table name:
> >
> > CREATE OR REPLACE FUNCTION notify_make_msg (table_name VARCHAR2)
> > RETURN
> >
> > SYS.AQ$_JMS_TEXT_MESSAGE AS msg SYS.AQ$_JMS_TEXT_MESSAGE;
> >
> > BEGIN
> >
> > msg := SYS.AQ$_JMS_TEXT_MESSAGE.CONSTRUCT();
> > msg.set_string_property('APP', USER);
> > RETURN msg;
> >
> > END;
> >
> > 3.
> >
> > Create the| notify_enqueue| procedure provided. This procedure
> > sends the message to |notify_queue|. *TopLink* throws an
> > exception, but the message may be ignored if there are no
> > recipients to receive it:
> >
> > CREATE OR REPLACE PROCEDURE notify_enqueue (msg SYS.AQ$_JMS_TEXT_
> >
> > MESSAGE) AS queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
> > msg_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
> > msg_id RAW(16);
> > no_recipients_for_message EXCEPTION;
> > PRAGMA EXCEPTION_INIT(no_recipients_for_message, -24033);
> >
> > BEGIN
> >
> > DBMS_AQ.ENQUEUE(queue_name => 'notify_enqueue', enqueue_options
> > => queue_options, message_properties => msg_properties,
> > payload => msg, msgid => msg_id);
> >
> > EXCEPTION
> >
> > WHEN no_recipients_for_message THEN NULL;-- ignore
> >
> > END;
> >
> > 4.
> >
> > Create a trigger for the |employee| table:
> >
> > CREATE OR REPLACE TRIGGER notify_employee AFTER UPDATE OR DELETE ON
> >
> > employee FOR EACH ROW DECLARE msg SYS.AQ$_JMS_TEXT_MESSAGE;
> >
> > BEGIN
> >
> > --a single call per trigger, pass the table name
> > msg := NOTIFY_MAKE_MSG('EMPLOYEE');
> > --a call for every primary key field
> > msg.set_double_property('EMP_ID', :old.EMP_ID);
> > NOTIFY_ENQUEUE(msg);
> >
> > END;
> >
> >
> >
> > If there is only a single application that requires
> > notification, the trigger need not enqueue the message in the
> > event that it was caused by the application:
> >
> > IF USER = 'app' THEN
> >
> > RETURN;
> >
> > END IF;
> >
> > After the transaction is committed, the corresponding JMS message is
> > delivered to all database subscribers.
> >
> > Application Setup
> >
> > This section provides information on how to connect the application
> > enabled by *TopLink* and information on JMS and *TopLink* cache
> > invalidation.
> >
> > Connecting the Application
> >
> > The application enabled by *TopLink* must be amended to connect using
> > the |app| user. However, it will work with database objects in the
> >
> > |dbuser| schema by setting the user to |dbuser| via either the
> > |preLogin()| event handler in Example: preLogin event handler
> >
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/DbC
> > hangeNotification/index.htm#CJHDDDIE> or the |postLogin()| event handler
> > in Example: postLogin event handler
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/Db
> > ChangeNotification/index.htm#CJHFDDHG>.
> >
> >
> > preLogin event handler
> >
> > //The pre-login method
> > public void preLogin(SessionEvent event){
> >
> > event.getSession().getLogin().setTableQualifier("dbuser");
> >
> > }
> >
> >
> >
> > postLogin event handler
> >
> > //The post-login method
> > public void postLogin(SessionEvent event){
> >
> > event.getSession().executeNonSelectingCall(new SQLCall("ALTER SESSION
> > SET CURRENT_SCHEMA = dbuser"));
> >
> > }
> >
> > JMS
> >
> > An application obtains |ConnectionFactory| and |Destination| by
> > invoking a Java Naming and Directory Interface (JNDI) lookup. The code
> > example in Example: How to obtain ConnectionFactory and Destination
> > using the oracle.jms package
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/DbC
> > hangeNotification/index.htm#CJHJFCBD> illustrates how |ConnectionFactory|
> > and |Destination| may be obtained with the use of the |oracle.jms|
> > package.
> >
> > Note: the condition defined in the |selector| string filters out
> > messages generated by the |app| user.
> >
> > How to obtain ConnectionFactory and Destination using the oracle.jms
> > package
> >
> > import javax.jms.*;
> > import oracle.jms.*;
> >
> > String url = "jdbc:oracle:thin:@localhost:1521:orcl"
> > String user = "app";
> > String password = "app";
> > String selector = "(APP IS NULL) OR (APP <> " + "'" + user + "')";
> >
> > // multiple_consumers => TRUE case:
> > TopicConnectionFactory factory =
> > AQjmsFactory.getTopicConnectionFactory(url,null); TopicConnection conn =
> > factory.createTopicConnection(user, password); TopicSession topicSession
> > = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic
> > = ((AQjmsSession) topicSession).getTopic("aqadm", "notify_queue");
> > Subscriber subscriber = topicSession.createSubscriber(topic, selector,
> > false); ....
> >
> > // multiple_consumers => FALSE case:
> > QueueConnectionFactory factory =
> > AQjmsFactory.getQueueConnectionFactory(url,null); QueueConnection conn =
> > factory.createQueueConnection(user, password); QueueSession queueSession
> > = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue
> > = ((AQjmsSession) queueSession).getQueue("aqadm", "notify_queue");
> > QueueReceiver receiver= queueSession.createReceiver(queue, selector);
> > ....
> >
> > *TopLink* Cache Invalidation
> >
> > To process change notification messages, an application enabled with
> > *TopLink* must prepare two maps: the first maps a table name to a
> > class, the second maps table names to a vector of primary key fields'
> > names.
> >
> > When a notification message is received, the application:
> > *
> >
> > Extracts the table name from it.
> >
> > *
> >
> > Searches the maps for the corresponding class and primary key
> > fields' names.
> >
> > *
> >
> > Extracts the primary key value from the message.
> >
> > *
> >
> > Invalidates the object in the *TopLink* cache.
> >
> > A sample CacheInvalidator Java class file that does all of the above
> > may be downloaded here
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/DbC
> > hangeNotification/CacheInvalidator.zip>.
> >
> > References
> >
> > Oracle *TopLink* Cache Invalidation How-To document
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/cac
> > heInvalidation/index.htm>
> >
> >
> > Oracle9i SQL Reference. Release 2 (9.2)
> > <http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/toc.htm>
> >
> > Oracle9i PL/SQL User's Guide and Reference. Release 2 (9.2)
> > <http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/toc.htm>
> >
> > Oracle9i Application Developer's Guide - Advanced Queuing. Release 2
> > (9.2)
> > <http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96587/toc.htm>
> >
> > Oracle9i Supplied PL/SQL Packages and Types Reference. Release 2 (9.2)
> > <http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96612/toc.htm>
> >
> > Oracle9i Supplied Java Packages Reference Release 2 (9.2)
> > <http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96609/toc.htm>
> >
> > Sun Java JMS Docs Web site <http://java.sun.com/products/jms/docs.html>
> > ||
> >
> > ------------------------------------------------------------------------
> >
> > Oracle *TopLink*, 10g Release 3 (10.1.3)
> >
> > The Programs (which include both the software and documentation)
> > contain proprietary information; they are provided under a license
> > agreement containing restrictions on use and disclosure and are also
> > protected by copyright, patent, and other intellectual and industrial
> > property laws. Reverse engineering, disassembly, or decompilation of
> > the Programs, except to the extent required to obtain interoperability
> > with other independently created software or as specified by law, is
> > prohibited.
> >
> > The information contained in this document is subject to change
> > without notice. If you find any problems in the documentation, please
> > report them to us in writing. This document is not warranted to be
> > error-free. Except as may be expressly permitted in your license
> > agreement for these Programs, no part of these Programs may be
> > reproduced or transmitted in any form or by any means, electronic or
> > mechanical, for any purpose.
> >
> > If the Programs are delivered to the United States Government or
> > anyone licensing or using the Programs on behalf of the United States
> > Government, the following notice is applicable:
> >
> > U.S. GOVERNMENT RIGHTS Programs, software, databases, and related
> > documentation and technical data delivered to U.S. Government
> > customers are "commercial computer software" or "commercial technical
> > data" pursuant to the applicable Federal Acquisition Regulation and
> > agency-specific supplemental regulations. As such, use, duplication,
> > disclosure, modification, and adaptation of the Programs, including
> > documentation and technical data, shall be subject to the licensing
> > restrictions set forth in the applicable Oracle license agreement,
> > and, to the extent applicable, the additional rights set forth in FAR
> > 52.227-19, Commercial Computer Software---Restricted Rights (June
> > 1987). Oracle Corporation, 500 Oracle Parkway, Redwood City, CA 94065
> >
> > The Programs are not intended for use in any nuclear, aviation, mass
> > transit, medical, or other inherently dangerous applications. It shall
> > be the licensee's responsibility to take all appropriate fail-safe,
> > backup, redundancy and other measures to ensure the safe use of such
> > applications if the Programs are used for such purposes, and we
> > disclaim liability for any damages caused by such use of the Programs.
> >
> > Oracle, JD Edwards and PeopleSoft are registered trademarks of Oracle
> > Corporation and/or its affiliates. Other names may be trademarks of
> > their respective owners.
> >
> > The Programs may provide links to Web sites and access to content,
> > products, and services from third parties. Oracle is not responsible
> > for the availability of, or any content provided on, third-party Web
> > sites. You bear all risks associated with the use of such content. If
> > you choose to purchase any products or services from a third party,
> > the relationship is directly between you and the third party. Oracle
> > is not responsible for: (a) the quality of third-party products or
> > services; or (b) fulfilling any of the terms of the agreement with the
> > third party, including delivery of products or services and warranty
> > obligations related to purchased products or services. Oracle is not
> > responsible for any loss or damage of any sort that you may incur from
> > dealing with any third party.
> >
> > Alpha and Beta Draft documentation are considered to be in prerelease
> > status. This documentation is intended for demonstration and
> > preliminary use only. We expect that you may encounter some errors,
> > ranging from typographical errors to data inaccuracies. This
> > documentation is subject to change without notice, and it may not be
> > specific to the hardware on which you are using the software. Please
> > be advised that prerelease documentation in not warranted in any
> > manner, for any purpose, and we will not be responsible for any loss,
> > costs, or damages incurred due to the use of this documentation.
> >
> > ------------------------------------------------------------------------
> > Copyright © 2006, Oracle. All rights reserved.
> > <http://www.oracle.com/technology/products/ias/toplink/technical/tips/sup
> > port/html/cpyr.htm>
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > eclipselink-users mailing list
> > eclipselink-users@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/eclipselink-users
--
Ing. José Arcángel Salazar Delgado
Net Trace: www.nettracemexico.com
Av 27 #6 Col. Venustiano Carranza.
Boca del río, Ver.
Tel. Oficina 9-27-54-78
Attachment:
signature.asc
Description: This is a digitally signed message part.