nest+数据库连接在长时间无活动后重连

server/2024/10/20 15:46:15/

在使用 NestJS 开发应用程序时,如果遇到数据库连接在长时间无活动后自动断开的问题,可以采取几种策略来解决这个问题。以下是一些常见的方法:

1. 使用连接池

NestJS 通常与 TypeORM 或 Sequelize 等 ORM 工具一起使用,这些工具都支持连接池。你可以配置连接池以保持连接活跃。

TypeORM 配置

如果你使用的是 TypeORM,可以在 ormconfig.json.env 文件中配置连接池选项。例如:

{"type": "mysql","host": "localhost","port": 3306,"username": "your_username","password": "your_password","database": "your_database","synchronize": true,"logging": false,"pool": {"max": 10, // 最大连接数"min": 2,  // 最小连接数"idleTimeoutMillis": 30000, // 连接空闲超时时间(毫秒)"acquireTimeoutMillis": 60000, // 获取连接的超时时间(毫秒)"createRetryIntervalMillis": 100, // 创建连接的重试间隔(毫秒)"connectionLimit": 10 // 连接限制}
}
Sequelize 配置

如果你使用的是 Sequelize,可以在配置文件中设置连接池选项。例如:

import { Sequelize } from 'sequelize';const sequelize = new Sequelize('database', 'username', 'password', {host: 'localhost',dialect: 'mysql',pool: {max: 10, // 最大连接数min: 0,  // 最小连接数acquire: 30000, // 获取连接的超时时间(毫秒)idle: 10000 // 连接空闲超时时间(毫秒)}
});

2. 发送心跳查询

通过定期发送心跳查询来保持连接活跃。你可以在 NestJS 中使用定时任务来实现这一点。

使用 @nestjs/schedule 模块

首先安装 @nestjs/schedulecron 包:

npm install @nestjs/schedule cron

然后在你的模块中导入 ScheduleModule 并配置一个定时任务:

import { Module, OnApplicationBootstrap } from '@nestjs/common';
import { ScheduleModule, CronExpression } from '@nestjs/schedule';
import { DataSource } from 'typeorm'; // 如果使用 TypeORM@Module({imports: [ScheduleModule.forRoot()],
})
export class AppModule implements OnApplicationBootstrap {constructor(private dataSource: DataSource) {}onApplicationBootstrap() {this.dataSource.query('SELECT 1'); // 初始心跳}@Cron(CronExpression.EVERY_5_MINUTES)handleCron() {this.dataSource.query('SELECT 1').then(() => {console.log('Heartbeat sent to the database');}).catch((err) => {console.error('Failed to send heartbeat to the database:', err);});}
}

3. 应用程序级别的重连机制

在应用程序级别添加重连机制,当检测到连接断开时自动重新建立连接。这通常需要捕获异常并尝试重新连接。

你可以在服务层或中间件中添加重连逻辑:

import { Injectable, OnModuleInit } from '@nestjs/common';
import { DataSource } from 'typeorm';@Injectable()
export class DatabaseService implements OnModuleInit {private reconnectAttempts = 0;private maxReconnectAttempts = 5;constructor(private dataSource: DataSource) {}async onModuleInit() {await this.dataSource.initialize();this.dataSource.on('error', (err) => this.handleConnectionError(err));}private async handleConnectionError(err: any) {if (this.reconnectAttempts < this.maxReconnectAttempts) {this.reconnectAttempts++;console.error(`Database connection error: ${err.message}. Attempting to reconnect...`);await this.dataSource.destroy();await this.dataSource.initialize();this.reconnectAttempts = 0; // 重置重连尝试次数} else {console.error(`Max reconnect attempts reached. Exiting...`);process.exit(1); // 或者其他处理方式}}
}

4. 调整数据库服务器配置

如前所述,你也可以调整数据库服务器的配置,例如 MySQL 的 wait_timeoutinteractive_timeout 参数,或者 PostgreSQL 的 idle_in_transaction_session_timeout 参数。

通过以上方法,你可以有效地解决 NestJS 应用程序中数据库连接在长时间无活动后自动断开的问题。选择哪种方法取决于你的具体环境和需求。


http://www.ppmy.cn/server/131788.html

相关文章

安卓13屏蔽蓝牙匹配对话框 自动匹配 android13屏蔽蓝牙匹配对话框 自动匹配

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 蓝牙连接的时候,会有匹配对话框提示。我们来实现自动配对。 2.问题分析 这里我们是通过点击操作来实现功能的,所以我们思路可以是自动点击功能的实现。 3.代码分…

【网络代理模块】反向代理(下)

1 反向代理部署遇到的问题 1.1 通道异常断开导致数据丢失 将外网程序布置在云服务器上&#xff08;外网&#xff09;测试&#xff0c;ssh协议进行测试会莫名其快通道断开&#xff0c;发现丢了一个报文。丢报文的原因是&#xff1a;我们内网模块从命令通道接收到外网模块发来的…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

每天一个数据分析题(四百九十七)- 序列模式挖掘

序列模式挖掘 (sequence pattern mining &#xff09;是指挖掘相对时间或其他模式出现频率高的模式&#xff0c;典型的应用还是限于离散型的序列。下列哪个选项不属于序列模式的时限约束&#xff1f; A. 最大跨度约束 B. 主键约束 C. 最小间隔和最大间隔约束 D. 窗口大小约…

gbase8s的事务、并发控制、锁机制、隔离级别

一、事务概念 事务是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元&#xff0c;可以简化错误恢复并使应用程序更…

软件评测CNAS资质获取流程

软件评测实验室如有意向申请 CNAS 检验机构认可&#xff0c;首先需要依据 CNAS 的认可准则建立管理体系&#xff0c;正式运行6个月以上&#xff0c;自我评估满足 CNAS 认可条件后可向 CNAS 提交申请。软件评测实验室CNAS认可的整体流程如图所示&#xff0c;后面的内容针对每个环…

MySQL索引优化

索引 索引分类&#xff1a; 主键索引唯一索引普通索引组合索引全文索引 主键索引 非空唯一索引&#xff0c;一个表只有一个主键索引&#xff1b;在 innodb 中&#xff0c;主键索引的 B 树包含表数据信息&#xff1b; PRIMARY KEY(key1, key2);唯一索引 不可以出现相同的值…

tp8自带的文件缓存如何配置

TP8自带的缓存是文件缓存。‌ ThinkPHP6默认的缓存驱动是文件缓存&#xff0c;它将缓存数据存储在应用的runtime目录下的cache目录中。文件缓存适用于单机环境下的应用&#xff0c;对于数据量较小且读写频率较低的应用场景&#xff0c;是一种简单有效的缓存方案‌。 ThinkPHP8…