Проверка возможности открытия двух дефолтных сессий из java в oracle


Пока разбирал-удалял сейчас свой старый тестовый код на домашней 11.2, наткнулся на проверку возможности открытия двух параллельных коннектов из внутренней java процедуры для независимых транзакций(когда-то где-то кто-то про это спрашивал) и решил запостить - вдруг кому-нибудь пригодится.
Если вкратце, то - нельзя! Все они на самом деле в одной транзакции(естественно, если не выполнять внутри них автономных).

Тестовая табличка:
create table TEST_TR(i INTEGER);
Java код:
create or replace and compile java source named jdbcconnections as
import java.sql.*;
import oracle.jdbc.*;

class JDBCConnections
{
  public static String test() throws SQLException
  {
    try {
        Connection conn1 = DriverManager.getConnection("jdbc:default:connection:");
        Connection conn2 = DriverManager.getConnection("jdbc:default:connection:");
        Statement stmt1 = conn1.createStatement();
        Statement stmt2 = conn2.createStatement();
        try
            {
              stmt1.executeQuery("insert into test_tr values(1)");
              stmt2.executeQuery("insert into test_tr values(2)");
              stmt2.executeUpdate("rollback");
              stmt1.executeUpdate("commit");
            }
         finally
            {
              try
                 {
                   stmt1.close();
                   stmt2.close();
                 }
              catch (Exception E)
                 {
                   return E.toString()+E.getMessage();
                 }
            }
        return conn1==conn2?"true":"false";
    } catch (Exception e) {
        return e.getMessage();
    }
  }
}
/
Обертка:
create or replace function jdbc_test
return varchar2 
as
  language java
  name 'JDBCConnections.test() return java.lang.String';
/
Код теста:
begin
  dbms_output.put_line('Conn1==Conn2 = '||jdbc_test);
  for rec in (select decode(count(*),1,'yes','no') res from test_tr) loop
    dbms_output.put_line('Two transactions? - '||rec.res);
  end loop;
end;
/

Comments

Sayan Malakshinov комментирует...

И, естественно, все будет нормально, если открывать вместо второго дефолтного "внешнее" соединение, типа:
Connection conn2 = DriverManager.getConnection("jdbc:oracle:thin:@localhost:port:sid","login","pass");

Отправить комментарий