Медленное выполнение SQL при подключении к Oracle из источника данных, контролируемого Weblogic - PullRequest
3 голосов
/ 29 марта 2012

ПРОБЛЕМА

Простой SQL, который возвращает около 500 строк занимает:

  1. 40 мс в жабе (возвращаются первые 500 строк)
  2. 500-600 мс в Java с подключением, полученным из экземпляра oracle.jdbc.pool.OracleDataSource class.
  3. 2100-2500 мс на Java с подключением, полученным из данных источник настроен в Weblogic при поиске через JNDI

Приведенные выше моменты времени исключают получение экземпляра соединения.

Проблема: низкая производительность варианта 3. Почему? Как это можно сделать более разумным?

НАСТРОЙКА

  1. Weblogic 10.3.5
  2. Oracle 11g RDMBS

ТЕСТ-КОД


    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.GregorianCalendar;
    import java.util.Hashtable;
    import java.util.List;

    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;

    import oracle.jdbc.OracleConnection;
    import oracle.jdbc.pool.OracleDataSource;

    import Facility;
    import BrowserSQL;

    public class JDBCTest {
        public static Connection conn;
        public static Connection getConnection(){
            String url= "localhost:1521:testdb";
            String usr="test";
            String pswd="test";
            Connection conn = null;
            try {
                OracleDataSource ods = new OracleDataSource();
                ods.setURL("jdbc:oracle:thin:@" + url);
                ods.setUser(usr);
                ods.setPassword(pswd); 
                conn = ods.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            return conn;
        }

        public static Connection getConnectionWeblogicJndi(){
            Connection conn = null;
            try {
                Hashtable ht = new Hashtable();
                ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
                ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
                Context ctx = new InitialContext(ht);
                DataSource ods = (DataSource)ctx.lookup("jdbc/test");
                conn = ods.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (NamingException e) {
                e.printStackTrace();
            }

            return conn;
        }

        //get the next val from given sequence.
        public static void runQuery(Connection conn, String sql){
            ResultSet rs=null;
            Statement stmt=null;
            try{
                stmt = conn.createStatement();
                rs = stmt.executeQuery(sql);
                while(rs.next()){}
            }catch(SQLException ex){
                ex.printStackTrace();
            }
            finally{
                close(rs,stmt,conn);
            }
        }

        public static void close(ResultSet rs, Statement ps, Connection conn){
            if (rs!=null) {
                try { rs.close(); } catch(SQLException ex) { ex.printStackTrace(); }
            }
            if (ps != null) {
                try { ps.close(); } catch (SQLException ex) { ex.printStackTrace(); }
            }
            if(conn !=null){
                try{ conn.close(); }catch(SQLException ex){ ex.printStackTrace(); }
            }
        }

        public static void main(String[]arg) throws SQLException {
            //Connection conn = JDBCTest.getConnectionWeblogicJndi();
            Connection conn = JDBCTest.getConnection();
            ((OracleConnection)conn).setDefaultRowPrefetch(1000);
            long a = GregorianCalendar.getInstance().getTimeInMillis();
            System.out.println("Stating testGetAllFacilityByQuery..."+a);
            runQuery(conn, BrowserSQL.getAllFacilities());
            long b = GregorianCalendar.getInstance().getTimeInMillis();
            System.out.println("End testGetAllFacilityByQuery..."+b + " -------- total time: "+(b-a)+" ms");
        }
    }

...