/*+ oracle no:comments */ pool de connexions et identification des utilisateurs

Créer un utilisateur et se connecter via SQL*Plus

sqlplus / as sysdba
SQL> create user gregory
identified by zdlrskjhgqdzesq5#
default tablespace users
temporary tablespace temp;

SQL> grant create session to gregory;
SQL> create role gregory_role;
SQL> grant select on emp to gregory_role;
SQL> ALTER USER gregory GRANT CONNECT THROUGH scott WITH ROLES gregory_role;

sqlplus scott[gregory]@orcl
Entrez le mot de passe (de scott) : *****
Connecté.
SQL> select user from dual;
USER
------------------------------
GREGORY


Comparaisons des types de connexions

Le programme dont les éléments sont fourni dans la section suivante sur une base 10.2 donne les suivants dans ma configuration :

1000x connexions sans pool (secondes)               : 162.093
1000x connexions avec pool (secondes) : 1.192
1000x connexions avec pool et proxy user (secondes) : 5.518

Sections de code Java
Creation d’une DataSource Oracle sans « connection cache » (i.e. sans pool) :

try {
ods = new OracleDataSource();
} catch (SQLException e) {
e.printStackTrace(System.out);
}
ods.setURL("jdbc:oracle:thin:@//leia:1521/orcl");
ods.setUser("scott");
ods.setPassword("tiger");
try {
ods.setConnectionCachingEnabled(false);
} catch (Exception e) {
e.printStackTrace(System.out);
}


Creation d’une DataSource Oracle avec « connection cache » (i.e. avec pool) :

try {
ods_c = new OracleDataSource();
} catch (SQLException e) {
e.printStackTrace(System.out);
}
ods_c.setURL("jdbc:oracle:thin:@//leia:1521/orcl");
ods_c.setUser("scott");
ods_c.setPassword("tiger");
try {
ods_c.setConnectionCachingEnabled(true);
} catch (Exception e) {
e.printStackTrace(System.out);
}

1000 connexions distinctes :

deptime = System.currentTimeMillis();
System.out.print("1000x connexions - sans pool (milliseconds) [");
j=100;
for (int i=0;i<=1000;i++) { j--; if (j==0) { j=100; System.out.print("."); } try { conn = (OracleConnection) ods.getConnection(); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select user from dual"); while (rset.next()) { //System.out.println("L'utilisateur connecté est : "+rset.getString("USER")); } conn.close(); } catch (SQLException e) { e.printStackTrace(System.out); } } System.out.println("] : "+Long.toString((System.currentTimeMillis()-deptime)));

1000 connexions via un pool de connexions :

deptime = System.currentTimeMillis();
System.out.print("1000x connexions - avec pool (milliseconds) [");
j=100;
for (int i=0;i<=1000;i++) { j--; if (j==0) { j=100; System.out.print("."); } try { conn = (OracleConnection) ods_c.getConnection(); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select user from dual"); while (rset.next()) { //System.out.println("L'utilisateur connecté est : "+rset.getString("USER")); } conn.close(); } catch (SQLException e) { e.printStackTrace(System.out); } } System.out.println("] : "+Long.toString((System.currentTimeMillis()-deptime)));

1000 connexions via un pool de connexions avec authentification via un proxy user:

deptime = System.currentTimeMillis();
System.out.print("1000x connexions - avec pool et proxyuser (milliseconds) [");
j=100;
Properties p = new Properties();
p.put("PROXY_USER_NAME", "gregory");
for (int i=0;i<=1000;i++) { j--; if (j==0) { j=100; System.out.print("."); } try { conn = (OracleConnection) ods_c.getConnection(); conn.openProxySession(OracleConnection.PROXYTYPE_USER_NAME, p); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select user from dual"); while (rset.next()) { //System.out.println("L'utilisateur connecté est : "+rset.getString("USER")); } conn.close(OracleConnection.PROXY_SESSION); conn.close(); } catch (SQLException e) { e.printStackTrace(System.out); } } System.out.println("] : "+Long.toString((System.currentTimeMillis()-deptime)));