我有大约20个都使用MySQL的微服务,有一个数据库,但每个微服务都有 它有自己的模式,因此每个微服务的URL是不同的:

微服务1

spring.datasource.url=jdbc:mysql://localhost:3306/micro1_db

微服务2

spring.datasource.url=jdbc:mysql://localhost:3306/micro2_db

我不是DBA,所以当整个应用程序抛出连接问题时,我只需应用 MySQL上的以下命令:

set global max_connections = 400; (the default is 150 I think).

然后,几个月后,一个微服务出现故障,因此我为该特定微服务配置了以下内容:

spring.hikari.maximumPoolSize=20

应用程序在本地运行,用户非常少,我需要知道如何配置生产就绪.全球连接是必须的,如果是,建议的规模是多少. 每个微服务都需要"spring.hikari.max_PoolSize=20",这两种配置是 一起工作. 该应用程序不是Facebook的规模,但应该允许同时5位数的数字,我假设.

推荐答案

MySQL的max_connections对于所有模式都是全局的.出于此目的,MySQL Server没有区分不同的模式或不同的客户端.max_connections是所有模式、所有客户端的总和.

您的大小应至少等于将同时连接的所有连接池的total大小.例如,如果您有20个微服务,每个微服务由一个带有一个连接池的Java进程组成,并且每个池的大小为20,那么总数将是400.

我支持一些运行多个JVM进程的微服务,每个进程都有自己的连接池.或者"微服务"由三个或更多用于负载均衡和冗余的实例组成.它们还创建了自己的连接池.一些服务具有运行后台服务的"SideCar"进程,而不仅仅是请求/响应处理程序.因此,实际的总数可能要高得多.


请回复您的 comments :

通常,使用连接池的应用程序可以运行比连接池大小多得多的线程,因为它们共享.也就是说,当应用程序需要执行数据库事务时,它会从池中请求连接,执行事务,然后立即将连接返回池.

在数据库事务之间,每个线程可以运行不需要数据库连接的其他代码.在此期间,它不应保持数据库连接.

如果线程在不需要的时候保留数据库连接,则池可能会用完所有可用连接.

如果您的应用程序线程确实需要持续的数据库连接,则需要增加池大小.

每个应用程序在其需要使用数据库连接的频率方面是不同的.我不知道你的申请,所以我无法预测你的最佳泳池大小.

Mysql相关问答推荐

MySQL 8.0.34-从后端系统管理AWS RDS上的持久连接内存使用

MySQL在使用SELECT*时不使用索引

对多个数据库运行UPDATE mySQL查询

了解MySQL_stmt_BIND_NAMED_Param()-MySQL C API

Mysql,从两个不同的表中添加原始数据,从第一个表中获取所有内容,仅从第二个表中获取curdate内容

MySQL 8.0.33 Select json列时出现错误:排序内存不足,请考虑增加服务器排序缓冲区大小

从连接表中try 按唯一ID计算行数 MySQL

「已解决」MySQL 连接在 vb6 上出现运行时错误 -2147467259 (80004005),但在 VBA Excel 上工作

mysql insert into select join - 通过连接表将值从一列复制到另一表

如何 Select 具有最新的 2 个日期字段的行?

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

如何在每个国家/地区查询 GHTorrent(类 SQL 语言)的最常用语言

非常规字符的不正确字符串值错误

MySQL 5.6 DATETIME 不接受毫秒/微秒

Amazon RDS Aurora 与 RDS MySQL 与 EC2 上的 MySQL?

mysqli_fetch_array() 期望参数 1 为 mysqli_result,布尔值

在mysql中增量更新值

NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)

如何在执行 sql 脚本时 echo 打印语句

带有 WHERE 子句的 MySql 内连接