Java中的连接池和线程池设置

hgu*_*ser 6 java multithreading connection-pooling jdbc threadpool

使用 Hikari 池的 Spring 应用程序。

现在对于来自客户端的单个请求,我必须查询 10 个表(需要业务),然后将结果组合在一起。并且查询每张表可能需要 50ms 到 200ms。为了加快响应时间,我FixedThreadPool在我的服务中创建了一个查询不同线程中的每个表(伪代码):

class MyService{
    final int THREAD_POOL_SIZE = 20;
    final int CONNECTION_POOL_SIZE = 10;


    final ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
    protected DataSource ds;


    MyClass(){
        Class.forName(getJdbcDriverName());
        HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(CONNECTION_POOL_SIZE);
        ds = new HikariDataSource(config);
    }



    public Items doQuery(){
        String[] tables=["a","b"......]; //10+ tables
        Items result=new Items();
        CompletionService<Items> executorService = new ExecutorCompletionService<Items>(pool);
        for (String tb : tables) {
            Callable<Item> c = () -> {
                Items items = ds.getConnection().query(tb); ......
                return Items;
            };
            executorService.submit(c);
        }


        for (String tb: tables) {
            final Future<Items> future = executorService.take();
            Items items = future.get();
            result.addAll(items);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在对于单个请求,平均响应时间可能为 500 毫秒。

在此处输入图片说明

但是对于并发请求,平均响应时间会快速增加,请求越多,响应时间就会越长。

在此处输入图片说明

我想知道如何设置正确的连接池大小和线程池大小以使应用程序有效工作?

顺便说一句,该数据库在云中使用 RDS,具有 4 cpu 16GB mem、2000 个最大连接和 8000 个最大 IOPS。

sko*_*ott 5

您可能需要考虑更多参数:
1. 数据库的最大并发请求参数。云提供商对不同层的并发请求有不同的限制,您可能需要检查您的。

2.当你说50-200ms的时候,虽然很难说,平均有8个50ms的请求和2个200ms的请求还是都差不多?为什么?您的 doQuery 可能会受到占用最长时间(200 毫秒)的查询的限制,但占用 50 毫秒的线程将在任务完成后被释放,使其可用于下一组请求。

3. 您期望获得的 QPS 是多少?

一些计算:如果单个请求需要 10 个线程,并且您已配置 100 个连接,并发查询限制为 100,假设每个查询 200 毫秒,您一次只能处理 10 个请求。如果大多数查询需要 50 毫秒左右,则可能比 10 好一点(但我不会乐观)。

当然,如果您的任何查询需要超过 200 毫秒(网络延迟或其他任何东西),其中一些计算就会被折腾,在这种情况下,我建议您在连接端安装一个断路器(如果您被允许中止)超时后的查询)或在 API 端。

注意最大连接限制最大并发查询限制不同

建议:既然你需要500ms以下的响应,你也可以在池子上设置一个100-150ms左右的connectionTimeout。最坏情况:150 毫秒连接超时 + 200 毫秒查询执行 + 100 毫秒应用程序处理 < 500 毫秒响应。作品。