TypeORM 数据源(DataSource)详解与使用指南
什么是数据源(DataSource)
在 TypeORM 中,DataSource
是与数据库交互的核心组件。它相当于数据库连接的中央管理器,负责以下关键功能:
- 连接配置管理:存储数据库连接的所有配置参数
- 连接池管理:根据使用的RDBMS类型,建立初始数据库连接或连接池
- 生命周期控制:通过
initialize
和destroy
方法管理连接的创建和销毁
数据源的生命周期通常与应用程序一致:
- 在应用启动时调用
initialize
建立连接 - 在应用结束时调用
destroy
关闭连接(对于长期运行的服务器应用,通常不需要主动销毁)
创建数据源实例
创建数据源的基本流程如下:
import { DataSource } from "typeorm"
// 创建数据源实例
const AppDataSource = new DataSource({
type: "mysql", // 数据库类型
host: "localhost", // 数据库主机地址
port: 3306, // 数据库端口
username: "test", // 数据库用户名
password: "test", // 数据库密码
database: "test", // 数据库名称
entities: [/* 实体类列表 */], // 使用的实体类
synchronize: true // 是否自动同步数据库结构
})
// 初始化连接
AppDataSource.initialize()
.then(() => console.log("数据库连接已建立"))
.catch(err => console.error("连接失败", err))
关键配置选项
数据源支持多种配置参数,主要分为:
-
基础连接配置:
type
: 数据库类型(mysql/postgres/sqlite等)host
/port
: 数据库地址和端口username
/password
: 认证信息database
: 数据库名称
-
高级配置:
entities
: 使用的实体类列表synchronize
: 是否自动同步数据库结构(开发环境使用)logging
: 是否启用SQL日志poolSize
: 连接池大小
-
多数据源场景: 可以创建多个数据源实例,分别连接不同的数据库:
const PrimaryDB = new DataSource({ /* 主库配置 */ });
const ReportDB = new DataSource({ /* 报表库配置 */ });
数据源的使用方法
初始化后的数据源可以在应用的任何地方使用,主要通过以下两种方式操作数据库:
1. 使用EntityManager
import { AppDataSource } from "./data-source"
import { User } from "../entity/User"
// 使用实体管理器进行CRUD操作
const userRepository = AppDataSource.manager;
const users = await userRepository.find(User);
const newUser = userRepository.create(User, { /* 数据 */ });
await userRepository.save(newUser);
2. 使用Repository模式
// 获取特定实体的Repository
const userRepository = AppDataSource.getRepository(User);
// 使用Repository API
const adminUsers = await userRepository.findBy({ role: "admin" });
const userCount = await userRepository.count();
最佳实践建议
- 全局单例:将数据源实例作为全局单例使用,避免重复创建连接
- 环境区分:开发环境可以启用
synchronize
和logging
,生产环境应关闭 - 连接池优化:根据应用负载调整
poolSize
参数 - 错误处理:实现连接重试机制处理网络波动
- 类型安全:结合TypeScript类型定义确保操作安全
常见问题解答
Q: 什么时候需要手动调用destroy方法? A: 通常在短期运行的脚本或测试用例中需要手动销毁连接,长期运行的服务器应用一般不需要。
Q: 如何监控连接池状态? A: TypeORM提供了连接池状态查询API,可以通过监听事件或查询属性获取状态信息。
Q: 多数据源场景下事务如何处理? A: TypeORM支持跨数据源分布式事务,但实现较为复杂,建议尽量避免或使用其他方案如Saga模式。
通过合理配置和使用DataSource,可以构建高效可靠的数据库访问层,为应用提供稳定的数据持久化能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考