- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用 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);
}
}
}
现在对于单个请求,平均响应时间可能是 500 毫秒。
但对于并发请求,平均响应时间会迅速增加,请求越多,响应时间越长。
我想知道如何设置适当的连接池大小和线程池大小以使应用有效运行?
顺便说一句,数据库在云中使用 RDS,具有 4 个 cpu 16GB 内存,最大连接数 2000 和最大 IOPS 8000。
最佳答案
您可能需要考虑更多参数:
1.数据库的最大并发请求参数。云提供商对不同层的并发请求有不同的限制,您可能需要检查一下。
2、当你说50-200ms的时候,虽然不好说,但平均有8个50ms的请求和2个200ms的请求,还是都差不多?为什么?您的 doQuery 可能会受到查询耗时最长(200 毫秒)的限制,但耗时 50 毫秒的线程将在任务完成后释放,使它们可用于下一组请求。
3. 您期望收到的QPS是多少?
一些计算:如果单个请求需要 10 个线程,并且您已配置 100 个连接和 100 个并发查询限制,假设每个查询 200 毫秒,您一次只能处理 10 个请求。如果大多数查询需要 50 毫秒左右,可能会比 10 好一点(但我不会乐观)。
当然,如果您的任何查询花费 >200 毫秒(网络延迟或任何其他),这些计算中的一些就会失败,在这种情况下,我建议您在连接端使用断路器(如果您是允许在超时后中止查询)或在 API 端。
注意:最大连接限制与最大并发查询限制不同。
建议:由于您需要 500 毫秒以下的响应,您还可以在池上设置大约 100-150 毫秒的连接超时。最坏情况:150 毫秒连接超时 + 200 毫秒查询执行 + 100 毫秒应用程序处理 < 500 毫秒响应。有效。
关于java - Java中的连接池和线程池设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58352250/
我在一次采访中被问到这个问题,但无法回答。也没有找到任何相关信息。 最佳答案 正如 Docker 文档中所述,Docker 注册表是: [...] a hosted service containin
我目前正在为我的应用程序上的所有用户使用单个 mysql 连接。我想开始使用一个池(它应该更优化,对吧?)但我有一个“结构”问题:createPool 方法只适用于回调,我不明白如何通过与 socke
据我所知,“testOnBorrow”和“validationQuery”参数正合我意,但它们似乎没有按预期工作。 我启动应用程序,运行一些查询,一切正常。然后我重新启动 postgres 服务器 -
我需要解决 Entity Framework 核心中的 Multi-Tenancy 问题。每个租户都有自己的数据库(由于历史原因,无法更改)。 我将按照许多地方的建议使用上下文工厂(example 1
我有两个文件: x.py class BF(object) def __init__(): . . def add(self,z): . . y.py from y
我是一名优秀的程序员,十分优秀!