Java JDBC多个连接与单个连接具有相同的性能

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++) {

我编写了一个简单的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++) {
            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)

  • 我使用了一个连接,在for循环中以顺序方式执行了20个查询
  • 我在一个池中设置了10个连接,并在10个线程中运行了20个查询
  • 我原以为第二种方法会用更少的时间来完成这20个查询,但经过测试,结果显示这两种方法返回的时间消耗相似

    我可以确认,当我运行第二种方法时,它在db中创建了10个会话


    第二种方法的性能是否比第一种方法更好?让第二个性能与第一个性能相同会有什么问题?

    有很多不同的因素,例如:您在创建线程、连接池初始化、创建会话等方面花费了多少时间。但是作为开发人员,您不应该猜测,只要追踪/描绘它,你就会得到真实的画面什么是
    ds
    ?@Andreas
    OracleDataSource
    类用
    ds
    初始化ie
    OracleDataSource ds=new OracleDataSource()谢谢@Joe,是的。这是OracleDataSource Andreas真的?!?这很奇怪,因为问题中的代码有例如
    ds.init(connectionSize,settings)
    ,但OracleDataSource
    没有
    init()
    方法。