多线程用同一个connection查询,最后还是串行查询?

298 阅读1分钟

@Test
public void mulityThreadConnectionTest1() {
    List<Thread> threads = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        int j = i;
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Statement statement = connection.createStatement();
                    ResultSet resultSet = null;
                    if(j % 2 == 0 ) {
                        System.out.println("Thread is " + Thread.currentThread().getName() + "start to query");
                        resultSet = statement.executeQuery("select sleep(1000) ,id from test_oracle limit 1");
                        System.out.println("Thread name is : " + Thread.currentThread().getName() + "result is {}" +(resultSet.getMetaData()));
                    } else {
                        System.out.println("Other thread :  " + Thread.currentThread().getName() + " start to query");
                        resultSet = statement.executeQuery("select id from test_oracle limit 1");
                        System.out.println("Thread name is : " + Thread.currentThread().getName() + "result is {}" +(resultSet.getMetaData()));
                    }

                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        },"thread: " + i);
        thread.start();
        threads.add(thread);
    }
    threads.forEach(thread -> {
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });

}


@Test
public void mulityThreadConnectionTest2() {
    List<Future> futures = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        int j = i;
        CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
            @SneakyThrows
            @Override
            public void run() {
                Statement statement = connection.createStatement();
                ResultSet resultSet = null;
                if (j % 2 == 0) {
                    System.out.println("Thread is " + Thread.currentThread().getName() + "start to query");
                    resultSet = statement.executeQuery("select sleep(1000) from dual limit 1");
                    System.out.println("Thread name is : " + Thread.currentThread().getName() + "result is {}" + (resultSet.getMetaData()));
                } else {
                    System.out.println("Other thread :  " + Thread.currentThread().getName() + " start to query");
                    resultSet = statement.executeQuery("select id from test_oracle limit 1");
                    System.out.println("Thread name is : " + Thread.currentThread().getName() + "result is {}" + (resultSet.getMetaData()));
                }

            }

        });
        futures.add(future);
    }
    CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
    
}


测试结果发现,一个connection,多个并发同时用,底层还是串行的。

image.png