- jdbc/
- Jdbc 在Oracle连接下从Weblogic控制的数据源执行缓慢的sql
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-您能将计时分为打开连接所需的时间和运行查询所需的时间吗?数据库会话是否已打开并在连接池中可用?或者您正在创建新的物理数据库连接?如果您正在创建新的物理数据库连接,为什么要在基准测试中包括连接时间?事实上,您可能是在启动时在池中分配连接,将来很少打开和关闭连接。池是如何配置的?最小值是否设置为等于最大值?