Java JDBC多个连接与单个连接具有相同的性能
我编写了一个简单的java程序,使用JDBC运行20个查询来从视图中获取数据Java JDBC多个连接与单个连接具有相同的性能,java,oracle,jdbc,Java,Oracle,Jdbc,我编写了一个简单的java程序,使用JDBC运行20个查询来从视图中获取数据 int connectionSize = 10; ds.init(connectionSize, settings); ExecutorService executor = Executors.newFixedThreadPool(10); try { stopwatch.start(); for (int i = 0; i < 20; i++) {
int connectionSize = 10;
ds.init(connectionSize, settings);
ExecutorService executor = Executors.newFixedThreadPool(10);
try {
stopwatch.start();
for (int i = 0; i < 20; i++) {
executor.execute(new Runnable() {
@Override
public void run() {
String sql = String.format("select * from viewA where userId in (%s)", randomUserIds(5));
PreparedStatement ps = null;
Connection conn = null;
try {
while ((conn = ds.getConnection()) == null) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
logger.error(e.getMessage(), e);
}
}
logger.info("conn: " + conn.toString());
ps = conn.prepareStatement(sql);
ps.executeQuery();
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (conn != null) {
ds.returnConnection(conn);
}
}
}
});
}
executor.shutdown();
boolean finished = executor.awaitTermination(10, TimeUnit.MINUTES);
stopwatch.stop();
logger.log(Level.INFO, "Query Complete in " + stopwatch);
} catch (Exception ex) {
ex.printStackTrace();
}
int connectionSize=10;
ds.init(连接大小、设置);
ExecutorService executor=Executors.newFixedThreadPool(10);
试一试{
秒表。开始();
对于(int i=0;i<20;i++){
executor.execute(新的Runnable(){
@凌驾
公开募捐{
String sql=String.format(“从视图中选择*,其中用户ID位于(%s)”,randomUserID(5));
PreparedStatement ps=null;
连接conn=null;
试一试{
而((conn=ds.getConnection())==null){
试一试{
睡眠(10000);
}捕捉(中断异常e){
logger.error(e.getMessage(),e);
}
}
logger.info(“conn:+conn.toString());
ps=连接准备状态(sql);
ps.executeQuery();
ps.close();
}捕获(例外情况除外){
例如printStackTrace();
}最后{
如果(conn!=null){
ds.返回连接(连接);
}
}
}
});
}
executor.shutdown();
布尔完成=执行器等待终止(10,时间单位:分钟);
秒表;
logger.log(Level.INFO,“在”+秒表中完成查询”);
}捕获(例外情况除外){
例如printStackTrace();
}
e、 g.从用户ID所在的视图中选择*(随机数个用户ID)
第二种方法的性能是否比第一种方法更好?让第二个性能与第一个性能相同会有什么问题?有很多不同的因素,例如:您在创建线程、连接池初始化、创建会话等方面花费了多少时间。但是作为开发人员,您不应该猜测,只要追踪/描绘它,你就会得到真实的画面什么是
ds
?@AndreasOracleDataSource
类用ds
初始化ieOracleDataSource ds=new OracleDataSource()代码>谢谢@Joe,是的。这是OracleDataSource Andreas真的?!?这很奇怪,因为问题中的代码有例如ds.init(connectionSize,settings)
,但OracleDataSource
没有init()
方法。