SlideShare a Scribd company logo
Oracle Inter-Session
Communication
Oren Nakdimon
www.db-oriented.com
 oren@db-oriented.com
 +972-54-4393763
@DBoriented
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
http://db-oriented.com
Who Am
I?
INTER-SESSION COMMUNICATION
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
SGA
Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
SGA
Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Inbox
Session
Session
Outbox
Inbox Outbox
Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Inbox
Session
Session
Outbox
Inbox Outbox
Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Inbox
Session
Session
Outbox
Inbox Outbox
Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Session
Outbox
Inbox
Session
Inbox Outbox
Inbox
Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Outbox
SGA
Session
Outbox
Inbox
Session
Inbox Outbox
Inbox
Outbox Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Outbox
SGA
Session
Outbox
Inbox
Inbox Outbox
Outbox
Outbox Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Outbox
SGA
Session
Outbox
Inbox
Inbox Outbox
Outbox
Outbox Inbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Outbox
SGA
Session
Outbox
Inbox
Inbox Outbox
Outbox
Outbox Inbox
DEMO
Logger
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
pack_message (number)
pack_message (varchar2)
pack_message (date)
pack_message_raw
pack_message_rowid
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE';
procedure log(i_text in varchar2) is
l_status number;
begin
dbms_pipe.pack_message(user);
dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid')));
dbms_pipe.pack_message(sys_context('userenv', 'host'));
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message(i_text);
l_status := dbms_pipe.send_message(c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.send_message failed with status ' || l_status);
end if;
end log;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
) is
l_status number;
begin
l_status := dbms_pipe.receive_message(pipename => c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.receive_message failed with status ' || l_status);
end if;
dbms_pipe.unpack_message(o_user);
dbms_pipe.unpack_message(o_sid);
dbms_pipe.unpack_message(o_host);
dbms_pipe.unpack_message(o_time);
dbms_pipe.unpack_message(o_text);
end get_next;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
) is
l_status number;
begin
l_status := dbms_pipe.receive_message(pipename => c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.receive_message failed with status ' || l_status);
end if;
dbms_pipe.unpack_message(o_user);
dbms_pipe.unpack_message(o_sid);
dbms_pipe.unpack_message(o_host);
dbms_pipe.unpack_message(o_time);
dbms_pipe.unpack_message(o_text);
end get_next;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
) is
l_status number;
begin
l_status := dbms_pipe.receive_message(pipename => c_log_pipe);
if l_status != 0 then
raise_application_error(-20000,
'dbms_pipe.receive_message failed with status ' || l_status);
end if;
dbms_pipe.unpack_message(o_user);
dbms_pipe.unpack_message(o_sid);
dbms_pipe.unpack_message(o_host);
dbms_pipe.unpack_message(o_time);
dbms_pipe.unpack_message(o_text);
end get_next;
end pipe_demo;
unpack_message (number)
unpack_message (varchar2)
unpack_message (date)
unpack_message_raw
unpack_message_rowid
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public class Logger {
public static void main(String args[]) throws SQLException {
Properties info = new Properties();
info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setConnectionProperties(info);
try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Ready...");
System.out.println();
System.out.println("Time Host User SID Message");
System.out.println("--------------- -------------- ----- --- -------");
processRequests(connection);
System.out.println("Bye!");
System.out.println();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public static void processRequests(Connection connection) throws SQLException {
String user;
int sid;
String host;
Timestamp time;
String text = " ";
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public static void processRequests(Connection connection) throws SQLException {
String user;
int sid;
String host;
Timestamp time;
String text = " ";
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
public static void processRequests(Connection connection) throws SQLException {
String user;
int sid;
String host;
Timestamp time;
String text = " ";
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
CallableStatement callableStatement =
connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }");
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4, java.sql.Types.DATE);
callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR);
do {
callableStatement.executeUpdate();
user = callableStatement.getString(1);
sid = callableStatement.getInt(2);
host = callableStatement.getString(3);
time = callableStatement.getTimestamp(4);
text = callableStatement.getString(5);
System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
sid) + " " + text);
} while (!text.equals("ABORT"));
callableStatement.close();
}
}
PIPES
A Single Consumer
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
PIPES
Multiple Consumers
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
DEMO
Multiple Consumers
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package pipe_demo as
procedure log(i_text in varchar2);
procedure get_next
(
o_user out varchar2,
o_sid out number,
o_host out varchar2,
o_time out date,
o_text out varchar2
);
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
);
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
ALERTS (SIGNALS)
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
Session
Session
Session
Session
Session
Session
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo;
There is also dbms_alert.waitany
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
create or replace package body pipe_demo as
...
procedure send_many_logs
(
i_text in varchar2,
i_how_many in binary_integer
) is
c_alert_name constant varchar2(10) := 'DEMO_ALERT';
l_message varchar2(100);
l_status number;
begin
dbms_alert.register(c_alert_name);
dbms_alert.waitone(c_alert_name, l_message, l_status);
for i in 1 .. i_how_many
loop
pipe_demo.log(i_text || '# ' || to_char(i));
end loop;
dbms_alert.remove(c_alert_name);
end send_many_logs;
end pipe_demo; There is also dbms_alert.removeall
PIPES
Request and Response
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
SGA
Session
Inbox Outbox
Session
Inbox Outbox
Session
Inbox Outbox
dbms_pipe.unique_session_name
This presentation is available in http://db-oriented.com/presentations
©
Oren
Nakdimon
©
Oren
Nakdimon
DBMS_PIPE DBMS_ALERT
Type Named Pipes / Queue Signals / Broadcast
Implementation SGA structure Table
Transactional? Non-Transactional Transactional
Consumers of a specific
message
Single Consumer Zero-to-Multiple Consumers
Blocked Publisher? When pipe is full (“pipe put”
wait event)
When other session signaled
to the same alert and hasn’t
committed yet (TX lock), but
only if there are registered
consumers
Possible Loss of Messages? Instance crash/shutdown Multiple signals to the same
alert before read by the
consumer
THANK YOU
Oren Nakdimon
www.db-oriented.com
 oren@db-oriented.com
 +972-54-4393763
@DBoriented

More Related Content

PDF
Constraint Optimization
PDF
Indexes and Indexing in Oracle 12c
PDF
Oren nakdimon oh really... i didn't know it is supported in standard edition
PDF
Edition Based Redefinition Made Easy - Oren Nakdimon
PDF
How to upgrade your application with no downtime (using edition-based redefin...
PDF
Write Less (code) With More (Oracle Database 12c New Features)
PDF
Oren nakdimon - Design Patterns for PL/SQL and SQL - UKOUGtogether21
PDF
The Features That (maybe) You Didn't Know About
Constraint Optimization
Indexes and Indexing in Oracle 12c
Oren nakdimon oh really... i didn't know it is supported in standard edition
Edition Based Redefinition Made Easy - Oren Nakdimon
How to upgrade your application with no downtime (using edition-based redefin...
Write Less (code) With More (Oracle Database 12c New Features)
Oren nakdimon - Design Patterns for PL/SQL and SQL - UKOUGtogether21
The Features That (maybe) You Didn't Know About

What's hot (13)

PPTX
New PLSQL in Oracle Database 12c
PDF
PDF
MODELS'16 - RESTalk
PDF
Firebird 3 Windows Functions
PDF
JAX-RS and CDI Bike the (Reactive) Bridge
PPTX
PL/SQL Fundamentals I
PPT
Oracle PLSQL Step By Step Guide
PDF
Deep Dive Java 17 Devoxx UK
PPT
06 Using More Package Concepts
PPT
DAC training-batch -2020(PLSQL)
PPTX
ORACLE PL SQL FOR BEGINNERS
PPTX
Managing Unstructured Data: Lobs in the World of JSON
PPT
PL/SQL
New PLSQL in Oracle Database 12c
MODELS'16 - RESTalk
Firebird 3 Windows Functions
JAX-RS and CDI Bike the (Reactive) Bridge
PL/SQL Fundamentals I
Oracle PLSQL Step By Step Guide
Deep Dive Java 17 Devoxx UK
06 Using More Package Concepts
DAC training-batch -2020(PLSQL)
ORACLE PL SQL FOR BEGINNERS
Managing Unstructured Data: Lobs in the World of JSON
PL/SQL
Ad

Similar to Oracle Inter-Session Communication (20)

PPT
PDF
Performance measurement and tuning
 
PDF
Penetration Testing for Easy RM to MP3 Converter Application and Post Exploit
PDF
Write Less (Code) With More (Features) [UKOUG 22]
PDF
Real-Time Query for Data Guard
PPTX
Distributed Applications with Perl & Gearman
KEY
Study2study#4 nginx conf_1_24
PDF
linux-namespaces.pdf
PDF
Kicking off with Zend Expressive and Doctrine ORM (ZendCon 2016)
PPT
SQL- Introduction to PL/SQL
PDF
Dolibarr - information for developers and partners - devcamp Pau 2019
PDF
Container orchestration from theory to practice
PDF
OpenERP e l'arte della gestione aziendale con Python
PDF
Capistrano2
PPT
Fpga 06-data-types-system-tasks-compiler-directives
PDF
Hello, Is That FreeSWITCH? Then We're Coming to Check You!
PDF
PhpBB meets Symfony2
PDF
Benchmarking Perl (Chicago UniForum 2006)
PDF
Set Up & Operate Tungsten Replicator
PDF
Container Orchestration from Theory to Practice
Performance measurement and tuning
 
Penetration Testing for Easy RM to MP3 Converter Application and Post Exploit
Write Less (Code) With More (Features) [UKOUG 22]
Real-Time Query for Data Guard
Distributed Applications with Perl & Gearman
Study2study#4 nginx conf_1_24
linux-namespaces.pdf
Kicking off with Zend Expressive and Doctrine ORM (ZendCon 2016)
SQL- Introduction to PL/SQL
Dolibarr - information for developers and partners - devcamp Pau 2019
Container orchestration from theory to practice
OpenERP e l'arte della gestione aziendale con Python
Capistrano2
Fpga 06-data-types-system-tasks-compiler-directives
Hello, Is That FreeSWITCH? Then We're Coming to Check You!
PhpBB meets Symfony2
Benchmarking Perl (Chicago UniForum 2006)
Set Up & Operate Tungsten Replicator
Container Orchestration from Theory to Practice
Ad

Recently uploaded (20)

PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Digital Strategies for Manufacturing Companies
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
top salesforce developer skills in 2025.pdf
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
Essential Infomation Tech presentation.pptx
PPTX
history of c programming in notes for students .pptx
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
Transform Your Business with a Software ERP System
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
CHAPTER 2 - PM Management and IT Context
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Digital Strategies for Manufacturing Companies
VVF-Customer-Presentation2025-Ver1.9.pptx
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Upgrade and Innovation Strategies for SAP ERP Customers
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
top salesforce developer skills in 2025.pdf
Odoo POS Development Services by CandidRoot Solutions
Essential Infomation Tech presentation.pptx
history of c programming in notes for students .pptx
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Operating system designcfffgfgggggggvggggggggg
Transform Your Business with a Software ERP System
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Which alternative to Crystal Reports is best for small or large businesses.pdf
How to Choose the Right IT Partner for Your Business in Malaysia
Adobe Illustrator 28.6 Crack My Vision of Vector Design

Oracle Inter-Session Communication

  • 1. Oracle Inter-Session Communication Oren Nakdimon www.db-oriented.com  oren@db-oriented.com  +972-54-4393763 @DBoriented
  • 2. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon http://db-oriented.com Who Am I?
  • 4. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Session
  • 5. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Session
  • 6. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session SGA Session Session
  • 7. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session SGA Session Session
  • 8. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Inbox Session Session Outbox Inbox Outbox Inbox
  • 9. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Inbox Session Session Outbox Inbox Outbox Inbox
  • 10. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Inbox Session Session Outbox Inbox Outbox Inbox
  • 11. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Session Outbox Inbox Session Inbox Outbox Inbox Outbox
  • 12. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Outbox SGA Session Outbox Inbox Session Inbox Outbox Inbox Outbox Inbox
  • 13. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Outbox SGA Session Outbox Inbox Inbox Outbox Outbox Outbox Inbox
  • 14. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Outbox SGA Session Outbox Inbox Inbox Outbox Outbox Outbox Inbox
  • 15. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Outbox SGA Session Outbox Inbox Inbox Outbox Outbox Outbox Inbox
  • 17. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); end pipe_demo;
  • 18. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); end pipe_demo;
  • 19. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); end pipe_demo;
  • 20. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 21. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 22. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 23. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log; pack_message (number) pack_message (varchar2) pack_message (date) pack_message_raw pack_message_rowid
  • 24. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as c_log_pipe constant varchar2(13) := 'DEMO_LOG_PIPE'; procedure log(i_text in varchar2) is l_status number; begin dbms_pipe.pack_message(user); dbms_pipe.pack_message(to_number(sys_context('userenv', 'sid'))); dbms_pipe.pack_message(sys_context('userenv', 'host')); dbms_pipe.pack_message(sysdate); dbms_pipe.pack_message(i_text); l_status := dbms_pipe.send_message(c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.send_message failed with status ' || l_status); end if; end log;
  • 25. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ) is l_status number; begin l_status := dbms_pipe.receive_message(pipename => c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.receive_message failed with status ' || l_status); end if; dbms_pipe.unpack_message(o_user); dbms_pipe.unpack_message(o_sid); dbms_pipe.unpack_message(o_host); dbms_pipe.unpack_message(o_time); dbms_pipe.unpack_message(o_text); end get_next; end pipe_demo;
  • 26. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ) is l_status number; begin l_status := dbms_pipe.receive_message(pipename => c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.receive_message failed with status ' || l_status); end if; dbms_pipe.unpack_message(o_user); dbms_pipe.unpack_message(o_sid); dbms_pipe.unpack_message(o_host); dbms_pipe.unpack_message(o_time); dbms_pipe.unpack_message(o_text); end get_next; end pipe_demo;
  • 27. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ) is l_status number; begin l_status := dbms_pipe.receive_message(pipename => c_log_pipe); if l_status != 0 then raise_application_error(-20000, 'dbms_pipe.receive_message failed with status ' || l_status); end if; dbms_pipe.unpack_message(o_user); dbms_pipe.unpack_message(o_sid); dbms_pipe.unpack_message(o_host); dbms_pipe.unpack_message(o_time); dbms_pipe.unpack_message(o_text); end get_next; end pipe_demo; unpack_message (number) unpack_message (varchar2) unpack_message (date) unpack_message_raw unpack_message_rowid
  • 28. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 29. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 30. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 31. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public class Logger { public static void main(String args[]) throws SQLException { Properties info = new Properties(); info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER); info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD); OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setConnectionProperties(info); try (OracleConnection connection = (OracleConnection) ods.getConnection()) { DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("Ready..."); System.out.println(); System.out.println("Time Host User SID Message"); System.out.println("--------------- -------------- ----- --- -------"); processRequests(connection); System.out.println("Bye!"); System.out.println(); } }
  • 32. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public static void processRequests(Connection connection) throws SQLException { String user; int sid; String host; Timestamp time; String text = " "; CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
  • 33. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public static void processRequests(Connection connection) throws SQLException { String user; int sid; String host; Timestamp time; String text = " "; CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
  • 34. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon public static void processRequests(Connection connection) throws SQLException { String user; int sid; String host; Timestamp time; String text = " "; CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s",
  • 35. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 36. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 37. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 38. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon CallableStatement callableStatement = connection.prepareCall("{ call PIPE_DEMO.GET_NEXT(?,?,?,?,?) }"); callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER); callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR); callableStatement.registerOutParameter(4, java.sql.Types.DATE); callableStatement.registerOutParameter(5, java.sql.Types.VARCHAR); do { callableStatement.executeUpdate(); user = callableStatement.getString(1); sid = callableStatement.getInt(2); host = callableStatement.getString(3); time = callableStatement.getTimestamp(4); text = callableStatement.getString(5); System.out.println(time + " " + host + " " + user + " " + String.format("%3s", sid) + " " + text); } while (!text.equals("ABORT")); callableStatement.close(); } }
  • 40. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 41. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 42. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 44. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 46. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon
  • 47. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package pipe_demo as procedure log(i_text in varchar2); procedure get_next ( o_user out varchar2, o_sid out number, o_host out varchar2, o_time out date, o_text out varchar2 ); procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ); end pipe_demo;
  • 48. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 49. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 51. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon Session Session Session Session Session Session
  • 52. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 53. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo;
  • 54. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo; There is also dbms_alert.waitany
  • 55. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon create or replace package body pipe_demo as ... procedure send_many_logs ( i_text in varchar2, i_how_many in binary_integer ) is c_alert_name constant varchar2(10) := 'DEMO_ALERT'; l_message varchar2(100); l_status number; begin dbms_alert.register(c_alert_name); dbms_alert.waitone(c_alert_name, l_message, l_status); for i in 1 .. i_how_many loop pipe_demo.log(i_text || '# ' || to_char(i)); end loop; dbms_alert.remove(c_alert_name); end send_many_logs; end pipe_demo; There is also dbms_alert.removeall
  • 57. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox
  • 58. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon SGA Session Inbox Outbox Session Inbox Outbox Session Inbox Outbox dbms_pipe.unique_session_name
  • 59. This presentation is available in http://db-oriented.com/presentations © Oren Nakdimon © Oren Nakdimon DBMS_PIPE DBMS_ALERT Type Named Pipes / Queue Signals / Broadcast Implementation SGA structure Table Transactional? Non-Transactional Transactional Consumers of a specific message Single Consumer Zero-to-Multiple Consumers Blocked Publisher? When pipe is full (“pipe put” wait event) When other session signaled to the same alert and hasn’t committed yet (TX lock), but only if there are registered consumers Possible Loss of Messages? Instance crash/shutdown Multiple signals to the same alert before read by the consumer
  • 60. THANK YOU Oren Nakdimon www.db-oriented.com  oren@db-oriented.com  +972-54-4393763 @DBoriented