我使用的是Spring Boot(1.5.6),Hibernate,Postgres,Hikari(2.7.8).我的配置是:
spring.datasource.hikari.minimumIdle=1
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=50000
spring.datasource.hikari.connectionTimeout=30000
Run Code Online (Sandbox Code Playgroud)
我期望的是,空闲连接应在30000ms/30秒空闲后释放.
问题在于每个请求都要建立新的连接,保留所有空闲连接.所以经过一段时间我最终得到了20个空闲连接并且有了新的请求Hikari试图获得一个新的连接并得到SpringBootJPAHikariCP - Connection is not available, request timed out after 30001ms.
那么,我做错了什么.或者误解了配置?
Hikari初始化日志:
SpringBootJPAHikariCP - configuration:
allowPoolSuspension.............false
autoCommit......................true
catalog.........................none
connectionInitSql...............none
connectionTestQuery.............none
connectionTimeout...............30000
dataSource......................none
dataSourceClassName.............none
dataSourceJNDI..................none
dataSourceProperties............{password=<masked>}
driverClassName................."org.postgresql.Driver"
healthCheckProperties...........{}
healthCheckRegistry.............none
idleTimeout.....................30000
initializationFailFast..........true
initializationFailTimeout.......1
isolateInternalQueries..........false
jdbc4ConnectionTest.............false
jdbcUrl.........................jdbc:postgresql://localhost:5432/dbname
leakDetectionThreshold..........0
maxLifetime.....................50000
maximumPoolSize.................20
metricRegistry..................none
metricsTrackerFactory...........none
minimumIdle.....................1
password........................<masked>
poolName........................"SpringBootJPAHikariCP"
readOnly........................false
registerMbeans..................false
scheduledExecutor...............none
scheduledExecutorService........internal
schema..........................none
threadFactory...................internal
transactionIsolation............default
username........................"postgres"
validationTimeout...............5000
Run Code Online (Sandbox Code Playgroud)
更新: 在过去24小时内,我尝试了来自不同线程的多个解决方案,但没有一个解决了我的问题.所以这里的观察可能很重要.
SpringBootJPAHikariCP - Reset (autoCommit) on connection org.postgresql.jdbc.PgConnection@1344bbf1找到了这个日志.研究了
在HikariCP这个线程中连接时的重置(autoCommit).试图auto commit …现在我正在阅读一篇关于http://docs.sequelizejs.com/manual/installation/getting-started.html的文章
并且无法理解下面写的这句话。
如果您从多个进程连接到数据库,则必须为每个进程创建一个实例,但每个实例的 最大连接池大小应为“最大连接池大小除以实例数”。因此,如果您希望最大连接池大小为 90,并且您有 3 个工作进程,则每个进程的实例的最大连接池大小应为 30。
pool: {
max: 5,
min: 0,
idle: 10000
}
Run Code Online (Sandbox Code Playgroud)
连接池大小是多少?这是最大的意思吗?
我现在正在理解这样的连接池。如果“max”为 5,并且有 3 个用户想要访问数据库,则会为单个用户分配 3 个连接。
而如果有6个用户要获取DB,5个连接都分配给单个用户,由于只有5个连接,第6个用户必须等待。
所以我无法理解
每个实例的最大连接池大小应为“最大连接池大小除以实例数”。
任何人都可以解释一下吗?
在 Sequelize.js 中,您应该配置最大连接池大小(默认为 5)。当我在 AWS 中的自动缩放平台上工作时,我不知道如何处理此配置。
r3.2xlarge 上的 Aurora 数据库集群允许每个只读副本的最大连接数为 2000(您可以通过运行 SELECT @@MAX_CONNECTIONS; 获得该连接)。
问题是我不知道 EC2 上托管的每台服务器的正确配置应该是什么。正确的最大连接池大小应该是多少,因为我不知道自动缩放组将启动多少台服务器?通常情况下,DB MAX_CONNECTIONS 值应该除以连接池的数量(服务器一个),但我不知道最后会实例化多少个服务器。
在我们的发布日期,我们的并发用户数估计在 50000 到 75000 个并发用户之间。
有没有人以前有过这种情况的经验?
amazon-ec2 sequelize.js autoscaling amazon-aurora connection-pool
我正在研究 HikariCP 在我的一个项目中使用它。github 中项目页面的语句缓存部分表示它不支持连接池级别的准备好的语句缓存。
但初始化部分有以下代码片段
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
config.setUsername("bart");
config.setPassword("51mp50n");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
Run Code Online (Sandbox Code Playgroud)
并设置准备好的语句缓存配置。是为连接池还是下面的驱动程序配置的?addDataSourceProperty 方法支持哪些属性?
我将 FastAPI 用于生产应用程序,该应用程序几乎完全使用 asyncio,除非访问数据库。该数据库仍然依赖于同步 SQLAlchemy,因为异步版本当时仍处于 alpha(或早期 beta)状态。
虽然我们的服务最终会在访问数据库时进行同步阻塞调用,但它仍然包含在异步函数中。我们确实运行了多个工作进程和应用程序的多个实例,以确保我们不会遇到严重的瓶颈。
我知道 FastAPI 在使用该def controller_method方法时使用线程提供并发性,但我似乎找不到有关它如何控制环境的任何细节。有人可以帮助我了解如何控制进程可以生成的最大线程数。如果达到系统限制怎么办?
当我使用异步等待模型时,我在中间件中创建数据库连接对象,并将其注入到控制器操作中。
@app.middleware("http")
async def db_session_middleware(request: Request, call_next):
await _set_request_id()
try:
request.state.db = get_sessionmaker(scope_func=None)
response = await call_next(request)
finally:
if request.state.db.is_active:
request.state.db.close()
return response
Run Code Online (Sandbox Code Playgroud)
当通过线程完成时,控制器是否已经在单独的线程中调用,确保每个请求都有单独的连接?
现在,如果我无法限制主进程生成的线程数量,如果我的应用程序突然收到大量请求,它是否会超出数据库连接池限制并最终阻止我的应用程序?
FastAPI 是否有一个可以配置的中央线程池,或者是由 Uvicorn 控制的?
我看到 Uvicorn 有一个配置,可以使用该--limit-concurrency 60标志来限制并发性。这是控制在线程模式下创建的并发线程的数量吗?
如果是这样,这是否应该始终低于我的连接池(连接池 + max_overflow=40)
那么在这种情况下,我允许 uvicorn 并发限制为 60,我的数据库连接池配置应该是这样的?
engine = sqlalchemy.create_engine(
cfg("DB_URL"),
pool_size=40,
max_overflow=20,
echo=False,
pool_use_lifo=False,
pool_recycle=120
)
Run Code Online (Sandbox Code Playgroud)
在这种情况下是否使用了中央线程池?是否有任何示例项目可供我查看,以了解在大规模部署时如何配置。
我使用 Netflix Dispatch 作为参考,但如果还有其他项目,我肯定想看看。
在 Spring boot application.properties 文件中,我们有以下选项:
server.tomcat.max-threads = 100
server.tomcat.max-connections = 100
spring.datasource.tomcat.max-active = 100
spring.datasource.tomcat.max-idle = 30
Run Code Online (Sandbox Code Playgroud)
这是我的存储库类
public interface UserRepository extends JpaRepository<Users,Integer>{}
Run Code Online (Sandbox Code Playgroud)
这是服务类
@Service
@Transactional(rollbackFor = Exception.class)
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Integer id){return userRepository.findOne(id)}
Run Code Online (Sandbox Code Playgroud)
问题是,userRepository 如何创建与 DB 的连接以及它是否会使用我的应用程序属性文件中的连接池。我来自 JDBC 和 hibernate,在那里我使用了 DataManager、DataSource、Connection 类来使用连接池,但是在 Spring Boot 中,我没有这些类的任何代码行,一切正常
我正在使用 mysql 连接池来创建连接。代码如下所示。
var pool = mysql.createPool(connectionProps);
Run Code Online (Sandbox Code Playgroud)
通过访问池,即使连接不成功,我也会得到一个对象。我通过启动和停止 mysql 检查了它。
我想要的是,我需要检查连接是否成功,如下所示。
if(pool){ // mysql is started && connected successfully.
console.log('Connection Success');
doSomething();
}else{
console.log('Cant connect to db, Check ur db connection');
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西。那么我们如何使用 mysql 池对象来做到这一点呢?有人可以帮帮我吗?
谢谢 n 问候
建立 SQL 连接既昂贵又缓慢,因此我们在 3 层应用程序中使用连接池等概念。
当使用访问 SQL 数据库的 Azure 函数时,我们必须连接到数据库,然后执行我们的逻辑。这不会使 azure 功能变得很慢吗?这不会通过过度使用连接来降低数据库性能吗?
有没有办法在 Azure 函数中使用可重用的连接池?
sql-server database-connection azure-functions connection-pool
我在 Springboot 中有一个使用 Hikari 进行连接池的 REST API。Hikari 使用默认配置(池中 10 个连接,等待连接超时 30 秒)。API本身非常简单
public ResponseEntity analyseData(int companyId) {
Company company = companyRepository.findById(companyId);//takes 20ms
Analysis analysis = callRemoteRestAPI(company.data) //takes 120seconds
return ResponseEntity.status(200).body(analysis);
}
Run Code Online (Sandbox Code Playgroud)
该代码没有任何@Transactional 注释。我发现 JDBC 连接在我的 API 的整个持续时间内(即约 120 秒)一直保持。因此,如果我们收到超过 10 个请求,它们就会在 hikari 连接池上等待超时(30 秒)。但严格来说,JPA 查询完成后(上面的步骤 1),我的 API 不需要连接。
有没有办法让 spring 在查询后立即释放此连接,而不是保留它直到整个 API 完成处理?Spring 可以配置为为每个 JPA 请求获取连接吗?这样,如果我有多个 JPA 查询,其中散布着非常慢的操作,服务器吞吐量不会受到影响,并且它可以处理超过 10 个并发 API 请求。。
spring-boot ×3
hikaricp ×2
java ×2
node.js ×2
sequelize.js ×2
spring ×2
amazon-ec2 ×1
autoscaling ×1
caching ×1
express ×1
fastapi ×1
hibernate ×1
javascript ×1
mysql ×1
node-mysql ×1
oracle ×1
python ×1
sql-server ×1