![Page 1: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/1.jpg)
The On-Commit Database Trigger
Philipp Salvisberg
@phsalvisberg DOAG2017
![Page 2: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/2.jpg)
Our Company
The On-Commit Database Trigger2 23.11.2017
Trivadis is a market leader in IT consulting, system integration, solution engineering
and the provision of IT services focusing on and
technologies
in Switzerland, Germany, Austria and Denmark. We offer our services in the following
strategic business fields:
Trivadis Services takes over the interacting operation of your IT systems.
O P E R A T I O N
![Page 3: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/3.jpg)
COPENHAGEN
MUNICH
LAUSANNE
BERN
ZURICH
BRUGG
GENEVA
HAMBURG
DÜSSELDORF
FRANKFURT
STUTTGART
FREIBURG
BASEL
VIENNA
With over 600 Specialists and IT Experts in Your Region
The On-Commit Database Trigger3 23.11.2017
14 Trivadis branches and more than
600 employees
200 Service Level Agreements
Over 4,000 training participants
Research and development budget:
CHF 5.0 million
Financially self-supporting and
sustainably profitable
Experience from more than 1,900
projects per year at over 800
customers
![Page 4: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/4.jpg)
About Me
4
Trivadian since April 2000
– Senior Principal Consultant, Partner
– Member of the Board of Directors
– @phsalvisberg
– https://www.salvis.com/blog
– https://github.com/PhilippSalvisberg
Database centric development with Oracle database
Model Driven Software Development
Author of free SQL Developer Extensions PL/SQL Unwrapper, PL/SQL Cop,
plscope-utils, oddgen and Bitemp Remodeler
The On-Commit Database Trigger23.11.2017
![Page 5: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/5.jpg)
Agenda
The On-Commit Database Trigger5 23.11.2017
1. Use Case
2. Message Queuing Essentials
3. Database Setup for PL/SQL and JMS
4. PL/SQL Application Using JMS
5. Java Application Using JMS
6. Core Messages
![Page 6: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/6.jpg)
The On-Commit Database Trigger6 23.11.2017
Use Case
![Page 7: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/7.jpg)
Transactional Notification of Salary Changes
The On-Commit Database Trigger7 23.11.2017
ENAME JOB SAL
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2480
SCOTT ANALYST 3000
KING PRESIDENT 5000
… … …
Update emp set sal = sal * 2;
Rollback;
Update emp set sal = sal + 100
where job = 'SALESMAN';
Update emp set sal = sal + 200
where ename in ('MARTIN' ,'SCOTT');
Commit;
Notify aggregated changes, e.g.
– +300 for MARTIN
– +200 for SCOTT
ENAME JOB SAL
SMITH CLERK 1600
ALLEN SALESMAN 3200
WARD SALESMAN 2500
JONES MANAGER 5950
MARTIN SALESMAN 2500
BLAKE MANAGER 5700
CLARK MANAGER 4960
SCOTT ANALYST 6000
KING PRESIDENT 10000
… … …
ENAME JOB SAL
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2480
SCOTT ANALYST 3000
KING PRESIDENT 5000
… … …
ENAME JOB SAL
SMITH CLERK 800
ALLEN SALESMAN 1700
WARD SALESMAN 1350
JONES MANAGER 2975
MARTIN SALESMAN 1350
BLAKE MANAGER 2850
CLARK MANAGER 2480
SCOTT ANALYST 3000
KING PRESIDENT 5000
… … …
ENAME JOB SAL
SMITH CLERK 800
ALLEN SALESMAN 1700
WARD SALESMAN 1350
JONES MANAGER 2975
MARTIN SALESMAN 1550
BLAKE MANAGER 2850
CLARK MANAGER 2480
SCOTT ANALYST 3200
KING PRESIDENT 5000
… … …
![Page 8: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/8.jpg)
"Desired" Implementation
The On-Commit Database Trigger8 23.11.2017
CREATE OR REPLACE TRIGGER emp_trg FOR UPDATE OF sal ON emp
COMPOUND TRIGGER
t_emp_log t_emp_log_type := t_emp_log_type();
AFTER EACH ROW IS
BEGIN …
END AFTER EACH ROW;
ON COMMIT IS
BEGIN
FOR r IN (…)
LOOP
emp_notify(emp_log_type(r.log_id,
r.ename, r.old_sal, r.new_sal));
END LOOP;
t_emp_log.delete;
END ON COMMIT;
END;
![Page 9: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/9.jpg)
Transaction #2Transaction #1 Transaction #3ff.
Solution Architecture
The On-Commit Database Trigger9 23.11.2017
PL/SQL Trigger
AQ Callback
PL/SQL Procedure
Java App
Miller +200
Scott +200
Miller +100
RA
W
Scott +200
Miller +300
AG
GR
![Page 10: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/10.jpg)
Why Oracle Advanced Queuing (AQ)?
The On-Commit Database Trigger10 23.11.2017
Transactions
– Message processing is part of the database transaction
Asynchronous
– Limit the impact on original transaction (performance, robustness)
Control
– Limit the number of concurrent dequeue processes
– Set message priority to override default FIFO behaviour
Comprehensive API
– PL/SQL and Java (JMS)
![Page 11: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/11.jpg)
HTTP Calls from PL/SQL in Transaction #3ff.?
The On-Commit Database Trigger11 23.11.2017
Possible
– But not necessarily simpler
Options
– UTL_HTTP, low-level API, challenging over SSL
– APEX_WEB_SERVICE, easy to use after network ACL setup
No options
– UTL_DBWS, challenging to install and buggy (e.g. Bug 18705437 : UTL_DBWS
REQUESTS LARGER THAN 65599 ARE TRUNCATED)
– HttpUriType, super easy to use, but limited to GET calls over HTTP
![Page 12: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/12.jpg)
The On-Commit Database Trigger12 23.11.2017
Message Queuing Essentials
![Page 13: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/13.jpg)
Single Consumer (Point-to-Point / Queue)
The On-Commit Database Trigger13 23.11.2017
App A
Producer
App B
Consumerenqueue dequeue
![Page 14: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/14.jpg)
Multi-Consumer (Publish-Subscribe / Topic)
The On-Commit Database Trigger14 23.11.2017
App A
Producer
App B
Consumer
enqueue
dequeue
App C
Consumerdequeue
C C
B B
![Page 15: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/15.jpg)
Message States*
The On-Commit Database Trigger15 23.11.2017
Ready
Processed
Expired Waiting
* = additional sub-states exist, e.g. for ready: “in memory”, “deferred”, “spilled”, “deferred spilled”
![Page 16: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/16.jpg)
The On-Commit Database Trigger16 23.11.2017
Database Setup
for PL/SQL and JMS
![Page 17: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/17.jpg)
Source Code
The On-Commit Database Trigger17 23.11.2017
Examples in this presentation are simplified code excerpts
Complete source code is on GitHub
– https://github.com/PhilippSalvisberg/emptracker
![Page 18: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/18.jpg)
BEGIN
dbms_aqadm.create_queue_table (
queue_table => 'REQUESTS_QT',
queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE',
sort_list => 'PRIORITY,ENQ_TIME',
multiple_consumers => TRUE,
message_grouping => dbms_aqadm.transactional
);
dbms_aqadm.create_queue_table (
queue_table => 'RESPONSES_QT',
queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE',
sort_list => 'PRIORITY,ENQ_TIME',
multiple_consumers => TRUE
);
END;
Create Queue Tables
The On-Commit Database Trigger18 23.11.2017
![Page 19: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/19.jpg)
sys.aq$_jms_text_message javax.jms.TextMessage
The On-Commit Database Trigger19 23.11.2017
header aq$_jms_header
– replyto sys.aq$_agent
• name varchar2(10)
• address varchar2(1024)
• protocol number
– type varchar(100)
– userid varchar(100)
– appid varchar(100)
– groupid varchar(100)
– groupseq int
– properties varray(100) of
aq$_jms_userproperty
• name varchar(100)
• type int
• str_value varchar(2000)
• num_value number
• Java_type int
text_len int
text_vc varchar2(4000)
text_lob clob
Some member procedures/functions:
set_text / get_text
set_replyto / get_replyto
set_string_property / get_string_property
set_int_property / get_int_property
set_long_property / get_long_property
set_double_property / get_double_property
![Page 20: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/20.jpg)
Create Queues
The On-Commit Database Trigger20 23.11.2017
BEGIN
dbms_aqadm.create_queue (
queue_name => 'REQUESTS_AQ',
queue_table => 'REQUESTS_QT',
max_retries => 1,
retry_delay => 2, -- seconds
retention_time => 60*60*24*7 -- 1 week
);
dbms_aqadm.create_queue (
queue_name => 'RESPONSES_AQ',
queue_table => 'RESPONSES_QT',
max_retries => 1,
retry_delay => 2, -- seconds
retention_time => 60*60*24*7 -- 1 week
);
END;
![Page 21: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/21.jpg)
Start Queues
The On-Commit Database Trigger21 23.11.2017
BEGIN
dbms_aqadm.start_queue(
queue_name => 'REQUESTS_AQ'
,enqueue => TRUE
,dequeue => TRUE
);
dbms_aqadm.start_queue(
queue_name => 'RESPONES_AQ'
,enqueue => TRUE
,dequeue => TRUE
);
END;
![Page 22: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/22.jpg)
The On-Commit Database Trigger22 23.11.2017
PL/SQL Application
Using JMS
![Page 23: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/23.jpg)
Subscribe Topics
The On-Commit Database Trigger23 23.11.2017
BEGIN
-- for messages created in trx #1 to be processed in trx #2
dbms_aqadm.add_subscriber(
queue_name => 'requests_aq',
subscriber => sys.aq$_agent('RAW_ENQ', 'REQUESTS_AQ', 0),
rule => q'[tab.user_data.get_string_property('msg_type') = 'RAW']'
);
-- for response/logging messages produced in trx #2 and #3ff.
dbms_aqadm.add_subscriber(
queue_name => 'responses_aq',
subscriber => sys.aq$_agent('ALL_RESPONSES', 'RESPONSES_AQ', 0)
);
END;
![Page 24: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/24.jpg)
Database Trigger
The On-Commit Database Trigger24 23.11.2017
CREATE OR REPLACE TRIGGER emp_au_trg
AFTER UPDATE OF sal ON emp FOR EACH ROW
DECLARE
PROCEDURE enqueue IS …
l_jms_message sys.aq$_jms_text_message :=
sys.aq$_jms_text_message.construct;
BEGIN …
sys.dbms_aq.enqueue(queue_name => 'requests_aq',
enqueue_options => l_enqueue_options,
message_properties => l_message_props,
payload => l_jms_message,
msgid => l_msgid); …
BEGIN
IF :old.sal != :new.sal THEN
enqueue;
END IF;
END;
![Page 25: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/25.jpg)
Register Callback Procedure
The On-Commit Database Trigger25 23.11.2017
BEGIN
-- call raw_enq_callback procedure for every message produced in trx #1
dbms_aq.register(
reg_list => sys.aq$_reg_info_list(
sys.aq$_reg_info(
name => 'REQUESTS_AQ:RAW_ENQ',
namespace => dbms_aq.namespace_aq,
callback => 'plsql://raw_enq_callback?PR=0',
context => NULL
)
),
reg_count => 1
);
END;
![Page 26: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/26.jpg)
Callback Procedure
The On-Commit Database Trigger26 23.11.2017
CREATE OR REPLACE PROCEDURE raw_enq_callback (
context IN RAW,
reginfo IN SYS.AQ$_REG_INFO,
descr IN SYS.AQ$_DESCRIPTOR, -- queue_name, consumer_name, msg_id, …
payload IN RAW,
payloadl IN NUMBER
) IS
…
BEGIN
dequeue_all;
copy_id_to_jms_messages;
enqueue_aggr_messages;
EXCEPTION
…
END raq_enq_callback;
WITH
msg AS (
SELECT m.get_int_property('id') AS id,
m.get_string_property('ename') AS ename,
m.get_double_property('old_sal') AS old_sal,
m.get_double_property('new_sal') AS new_sal
FROM TABLE(t_jms_message) m
),
base AS (
SELECT MAX(id) OVER(PARTITION BY ename) AS id,
ename,
FIRST_VALUE(old_sal) OVER(PARTITION BY ename ORDER BY id) AS old_sal,
LAST_VALUE(new_sal) OVER(PARTITION BY ename ORDER BY id
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS new_sal
FROM msg
)
SELECT DISTINCT id, ename, old_sal, new_sal
FROM base
WHERE old_sal != new_sal
![Page 27: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/27.jpg)
Synchronous Call
The On-Commit Database Trigger27 23.11.2017
CREATE OR REPLACE FUNCTION tweet(in_text IN VARCHAR2) RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION; …
FUNCTION dequeue(in_correlation IN VARCHAR2) RETURN VARCHAR2 IS …
l_dequeue_options.wait := 5;
l_dequeue_options.correlation := in_correlation; …
dbms_aq.dequeue(dequeue_options => l_dequeue_options, …);
l_jms_message.get_text(l_text);
l_msg_type := l_jms_message.get_string_property('msg_type');
COMMIT;
RETURN l_msg_type || ': ' || l_text; …
END dequeue;
BEGIN
l_correlation := enqueue(in_text => in_text);
RETURN dequeue(in_correlation => l_correlation);
END tweet;
![Page 28: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/28.jpg)
The On-Commit Database Trigger28 23.11.2017
Java Application
Using JMS
![Page 29: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/29.jpg)
Spring Boot Application
The On-Commit Database Trigger29 23.11.2017
mvn spring-boot:run
Run it
@SpringBootApplication
public class EmptrackerApplication {
public static void main(String[] args) {
SpringApplication.run(EmptrackerApplication.class, args);
}
}
Define application
![Page 30: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/30.jpg)
Application Properties
The On-Commit Database Trigger30 23.11.2017
# EmpTracker
db.url=jdbc:oracle:thin:@localhost:1521:odb
db.user=emptracker
db.password=emptracker
…
# Logging
logging.level.com.salvis.emptracker=INFO
logging.level.org.springframework=ERROR
logging.level.twitter4j=INFO
# Twitter account, default in ${user.home}/emptracker.properties
# create OAuth keys via https://apps.twitter.com/
#twitter4j.oauth.consumerKey=
#twitter4j.oauth.consumerSecret=
#twitter4j.oauth.accessToken=
#twitter4j.oauth.accessTokenSecret=
![Page 31: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/31.jpg)
Message Listener Container
The On-Commit Database Trigger31 23.11.2017
@Configuration public class AppConfig { …
@Bean public DefaultMessageListenerContainer messageListenerContainer() {
DefaultMessageListenerContainer cont = new DefaultMessageListenerContainer();
cont.setMessageListener(new TextMessageListener());
cont.setConnectionFactory(
AQjmsFactory.getTopicConnectionFactory(messageDataSource()));
cont.setDestinationName("requests_aq");
cont.setPubSubDomain(true);
cont.setSubscriptionName("EmpTracker");
cont.setSubscriptionDurable(true);
cont.setMessageSelector("msg_type IN ('AGGR', 'TWEET')");
cont.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);
cont.setSessionTransacted(true);
cont.setConcurrency("1-4");
cont.setMaxMessagesPerTask(20);
cont.setReceiveTimeout(10);
return cont;
} …
}
![Page 32: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/32.jpg)
Message Listener
The On-Commit Database Trigger32 23.11.2017
@Component
public class TextMessageListener implements SessionAwareMessageListener<TextMessage> {…
public void onMessage(final TextMessage request, final Session session) {
try {
String text = request.getText();
if (text == null || text.isEmpty()) {
String ename = request.getStringProperty("ename");
Double oldSal = request.getDoubleProperty("old_sal");
Double newSal = request.getDoubleProperty("new_sal");
text = getText(ename, oldSal, newSal);
}
Status status = twitter.updateStatus(text);
String screenName = status.getUser().getScreenName();
sendResponse(request, session, screenName + ": " + text, "INFO");
session.commit();
} catch (Exception e) {…}
}
}
![Page 33: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/33.jpg)
The On-Commit Database Trigger33 23.11.2017
Core Messages
![Page 34: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/34.jpg)
Just Because You Can Doesn't Mean You Should
The On-Commit Database Trigger34 23.11.2017
Consider carefully what belongs
into an Oracle Database
Oracle AQ is a cost free option
and part of every database
edition – just use it
![Page 35: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/35.jpg)
Happy Queuing
The On-Commit Database Trigger35 23.11.2017
Make the granularity of a message a part of your design considerations, that’s the
key to improve overall messaging performance
Use dedicated queue tables and
queues for topics with high
throughput requirements
Messages are processed row by row,
contention issues are not unusual,
mitigation is similar to conventional
tables (e.g. increase PCTFREE)
Just be aware that AQ has a
limited scalability
![Page 36: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/36.jpg)
Questions and answers…Philipp Salvisberg
Senior Principal Consultant
Tel. +41 58 459 52 31
23.11.2017 The On-Commit Database Trigger36
![Page 37: The On-Commit Database Trigger · 2020. 10. 8. · COPENHAGEN MUNICH LAUSANNE BERN ZURICH BRUGG GENEVA HAMBURG DÜSSELDORF FRANKFURT STUTTGART FREIBURG BASEL VIENNA With over 600](https://reader036.vdocuments.site/reader036/viewer/2022062609/60ffe02a1a158646bb61107b/html5/thumbnails/37.jpg)
Trivadis @ DOAG 2017#OpenCompany
Booth: 3rd Floor – next to the escalator
We share our Know how!Just come across, Live-Presentationsand documents archive
T-Shirts, Contest and much more
We look forward to your visit
23.11.2017 The On-Commit Database Trigger37