Jdbc 在Oracle连接下从Weblogic控制的数据源执行缓慢的sql

Jdbc 在Oracle连接下从Weblogic控制的数据源执行缓慢的sql,jdbc,oracle11g,weblogic-10.x,Jdbc,Oracle11g,Weblogic 10.x,问题 返回大约500行的简单sql需要: 蟾蜍40毫秒(返回前500行) Java中的500-600毫秒,连接从 oracle.jdbc.pool.OracleDataSource类 Java中的2100-2500毫秒,通过数据获取连接 通过JNDI查找Weblogic中配置的源代码 上述计时不包括获取连接实例 问题:选项3的性能缓慢。为什么?如何使之更合理 设置 Weblogic 10.3.5 Oracle 11g RDMBS 测试代码 import java.sql.Connection;

问题

返回大约500行的简单sql需要:

  • 蟾蜍40毫秒(返回前500行)
  • Java中的500-600毫秒,连接从 oracle.jdbc.pool.OracleDataSource类
  • Java中的2100-2500毫秒,通过数据获取连接 通过JNDI查找Weblogic中配置的源代码
  • 上述计时不包括获取连接实例

    问题:选项3的性能缓慢。为什么?如何使之更合理

    设置

  • Weblogic 10.3.5
  • 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"); } } 导入java.sql.Connection; 导入java.sql.ResultSet; 导入java.sql.SQLException; 导入java.sql.Statement; 导入java.util.ArrayList; 导入java.util.GregorianCalendar; 导入java.util.Hashtable; 导入java.util.List; 导入javax.naming.Context; 导入javax.naming.InitialContext; 导入javax.naming.NamingException; 导入javax.sql.DataSource; 导入oracle.jdbc.OracleConnection; 导入oracle.jdbc.pool.OracleDataSource; 进口设施; 导入BrowserSQL; 公共类JDBCTest{ 公共静态连接; 公共静态连接getConnection(){ String url=“localhost:1521:testdb”; 字符串usr=“test”; 字符串pswd=“test”; 连接conn=null; 试一试{ OracleDataSource ods=新的OracleDataSource(); setURL(“jdbc:oracle:thin:@”+url); ods.setUser(usr); ods.setPassword(pswd); conn=ods.getConnection(); }捕获(SQLE异常){ e、 printStackTrace(); } 返回连接; } 公共静态连接getConnectionWeblogicJndi(){ 连接conn=null; 试一试{ Hashtable ht=新的Hashtable(); put(Context.INITIAL\u Context\u工厂,“weblogic.jndi.WLInitialContextFactory”); put(Context.PROVIDER_URL,“t3://localhost:7001”); 上下文ctx=新的初始上下文(ht); datasourceods=(DataSource)ctx.lookup(“jdbc/test”); conn=ods.getConnection(); }捕获(SQLE异常){ e、 printStackTrace(); }捕获(NamingE例外){ e、 printStackTrace(); } 返回连接; } //从给定序列中获取下一个val。 公共静态void runQuery(连接连接,字符串sql){ 结果集rs=null; 语句stmt=null; 试一试{ stmt=conn.createStatement(); rs=stmt.executeQuery(sql); while(rs.next()){} }catch(SQLException-ex){ 例如printStackTrace(); } 最后{ 关闭(rs、stmt、conn); } } 公共静态无效关闭(结果集rs、语句ps、连接连接){ 如果(rs!=null){ 尝试{rs.close();}catch(SQLException ex){ex.printStackTrace();} } 如果(ps!=null){ 尝试{ps.close();}catch(SQLException ex){ex.printStackTrace();} } 如果(conn!=null){ 尝试{conn.close();}catch(SQLException ex){ex.printStackTrace();} } } 公共静态void main(字符串[]arg)引发SQLException{ //Connection conn=JDBCTest.getConnectionWeblogicJndi(); Connection conn=JDBCTest.getConnection(); ((OracleConnection)conn.setDefaultRowPrefetch(1000); long a=GregorianCalendar.getInstance().getTimeInMillis(); System.out.println(“statingTestGetAllFacilityByQuery…”+a); runQuery(conn,BrowserSQL.getAllFacilities()); long b=GregorianCalendar.getInstance().getTimeInMillis(); System.out.println(“EndTestGetAllFacilityByQuery…”+b+“-----------总时间:”+(b-a)+“毫秒”); } }
    我在11g上看到标准连接池的性能非常差,专用连接池的性能有了很大的提高。@Alex-您能将计时分为打开连接所需的时间和运行查询所需的时间吗?数据库会话是否已打开并在连接池中可用?或者您正在创建新的物理数据库连接?如果您正在创建新的物理数据库连接,为什么要在基准测试中包括连接时间?事实上,您可能是在启动时在池中分配连接,将来很少打开和关闭连接。池是如何配置的?最小值是否设置为等于最大值?