DBMS_SESSION : Managing Sessions From a Connection Pool in Oracle Databases
A guide to using the DBMS_SESSION package to manage sessions that form part of a connection pool.
oracle miscconfigurationintermediate
by OracleDba
39 views
A guide to using the DBMS_SESSION package to manage sessions that form part of a connection pool.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
CONN test/test
EXEC sys.DBMS_SESSION.set_identifier('tim_hall');
COLUMN username FORMAT A20
COLUMN client_identifier FORMAT A20
SELECT USER AS username, SYS_CONTEXT('userenv', 'client_identifier') AS client_identifier FROM dual;
USERNAME CLIENT_IDENTIFIER
-------------------- --------------------
TEST tim_hall
SQL>
-- Start a new session, leaving the existing session running.
CONN / AS SYSDBA
COLUMN username FORMAT A20
COLUMN client_identifier FORMAT A20
SELECT username, client_identifier FROM v$session WHERE username = 'TEST';
USERNAME CLIENT_IDENTIFIER
-------------------- --------------------
TEST tim_hall
SQL>
-- Back in the original session.
EXEC sys.DBMS_SESSION.clear_identifier;
SELECT USER AS username, SYS_CONTEXT('userenv', 'client_identifier') AS client_identifier FROM dual;
USERNAME CLIENT_IDENTIFIER
-------------------- --------------------
TEST
SQL>
-- Back in the privileged session.
SELECT username, client_identifier FROM v$session WHERE username = 'TEST';
USERNAME CLIENT_IDENTIFIER
-------------------- --------------------
TEST
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
CONN / AS SYSDBA
GRANT CREATE ANY CONTEXT TO test;
CONN test/test
-- Create the context.
CREATE OR REPLACE CONTEXT parameter_ctx USING context_api;
-- Create the package to manage the context.
CREATE OR REPLACE PACKAGE context_api AS
PROCEDURE set_parameter(p_name IN VARCHAR2,
p_value IN VARCHAR2);
PROCEDURE clear_context (p_name IN VARCHAR2);
PROCEDURE clear_all_context;
END context_api;
/
CREATE OR REPLACE PACKAGE BODY context_api IS
PROCEDURE set_parameter (p_name IN VARCHAR2,
p_value IN VARCHAR2) IS
BEGIN
sys.DBMS_SESSION.set_context('parameter_ctx', p_name, p_value);
END set_parameter;
PROCEDURE clear_context (p_name IN VARCHAR2) IS
BEGIN
sys.DBMS_SESSION.clear_context('parameter_ctx', attribute => p_name);
END clear_context;
PROCEDURE clear_all_context IS
BEGIN
sys.DBMS_SESSION.clear_all_context('parameter_ctx');
END clear_all_context;
END context_api;
/
-- Set two values in the context and check them.
EXEC context_api.set_parameter('variable1', 'one');
EXEC context_api.set_parameter('variable2', 'two');
COLUMN variable1 FORMAT A20
COLUMN variable2 FORMAT A20
SELECT SYS_CONTEXT('parameter_ctx', 'variable1') AS variable1,
SYS_CONTEXT('parameter_ctx', 'variable2') AS variable2
FROM dual;
VARIABLE1 VARIABLE2
-------------------- --------------------
one two
SQL>
-- Clear one of the name-value pairs and retest.
EXEC context_api.clear_context('variable1');
SELECT SYS_CONTEXT('parameter_ctx', 'variable1') AS variable1,
SYS_CONTEXT('parameter_ctx', 'variable2') AS variable2
FROM dual;
VARIABLE1 VARIABLE2
-------------------- --------------------
two
SQL>
-- Clear all name-value pairs and retest.
EXEC context_api.clear_all_context;
SELECT SYS_CONTEXT('parameter_ctx', 'variable1') AS variable1,
SYS_CONTEXT('parameter_ctx', 'variable2') AS variable2
FROM dual;
VARIABLE1 VARIABLE2
-------------------- --------------------
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
-- Create a package with a package variable and GET/SET methods.
CREATE OR REPLACE PACKAGE p1 AS
FUNCTION get_value RETURN NUMBER;
PROCEDURE set_value (p_value IN NUMBER);
END p1;
/
CREATE OR REPLACE PACKAGE BODY p1 AS
g_number NUMBER := 1;
FUNCTION get_value RETURN NUMBER AS
BEGIN
RETURN g_number;
END get_value;
PROCEDURE set_value (p_value IN NUMBER) AS
BEGIN
g_number := p_value;
END set_value;
END p1;
/
-- Check the current value.
SELECT p1.get_value FROM dual;
GET_VALUE
----------
1
SQL>
-- Alter the value and retest.
EXEC p1.set_value(2);
SELECT p1.get_value FROM dual;
GET_VALUE
----------
2
SQL>
-- Reset the package state and retest.
EXEC sys.DBMS_SESSION.reset_package;
SELECT p1.get_value FROM dual;
GET_VALUE
----------
1
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
CONN / AS SYSDBA
GRANT SELECT ON v_$mystat TO test;
GRANT SELECT ON v_$statname TO test;
CONN test/test
-- Create a package with a collection as a package variable.
CREATE OR REPLACE PACKAGE p1 AS
FUNCTION get_pga_size RETURN NUMBER;
PROCEDURE populate_tab;
PROCEDURE empty_tab;
END p1;
/
CREATE OR REPLACE PACKAGE BODY p1 AS
TYPE t_tab IS TABLE OF all_objects%ROWTYPE;
g_tab t_tab;
FUNCTION get_pga_size RETURN NUMBER AS
l_number NUMBER;
BEGIN
SELECT ms.value
INTO l_number
FROM v$mystat ms
JOIN v$statname sn ON sn.statistic# = ms.statistic#
WHERE sn.name = 'session pga memory';
RETURN l_number;
END get_pga_size;
PROCEDURE populate_tab AS
BEGIN
SELECT *
BULK COLLECT INTO g_tab
FROM all_objects;
END populate_tab;
PROCEDURE empty_tab AS
BEGIN
g_tab.delete;
END empty_tab;
END p1;
/
-- Check the current PGA size.
SELECT p1.get_pga_size FROM dual;
GET_PGA_SIZE
------------
3273264
SQL>
-- Populate the collection and retest.
EXEC p1.populate_tab;
SELECT p1.get_pga_size FROM dual;
GET_PGA_SIZE
------------
47641136
SQL>
-- Empty the collection and retest.
EXEC p1.empty_tab;
SELECT p1.get_pga_size FROM dual;
GET_PGA_SIZE
------------
47641136
SQL>
-- Free unused memory and retest.
EXEC sys.DBMS_SESSION.free_unused_user_memory;
SELECT p1.get_pga_size FROM dual;
GET_PGA_SIZE
------------
5632560
SQL>12345678910111213141516171819202122232425
try {
String e2eMetrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
e2eMetrics[OracleConnection.END_TO_END_ACTION_INDEX] = "Starting";
e2eMetrics[OracleConnection.END_TO_END_MODULE_INDEX] = "MyProgram";
e2eMetrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = "tim_hall";
// Pre-12c
//((OracleConnection) conn).setEndToEndMetrics(e2eMetrics, (short) 0);
// 12c Onward
((OracleConnection) conn).setClientInfo(e2eMetrics, (short) 0);
} catch (SQLException sqle) {
// Do something...
}
try {
String e2eMetrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
e2eMetrics[OracleConnection.END_TO_END_ACTION_INDEX] = null;
e2eMetrics[OracleConnection.END_TO_END_MODULE_INDEX] = null;
e2eMetrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = null;
// Pre-12c
//((OracleConnection) conn).setEndToEndMetrics(e2eMetrics, Short.MIN_VALUE);
// 12c Onward
((OracleConnection) conn).setClientInfo(e2eMetrics, Short.MIN_VALUE);
} catch (SQLException sqle) {
// Do something...
}Please to add comments
No comments yet. Be the first to comment!