TypeORM+NestJS+Jest中EntityManager与QueryRunner实例存在差异吗?
TypeORM中EntityManager与QueryRunner实例的核心差异
二者存在明确的功能差异,最核心的区别在于数据库连接会话的隔离性,以下是具体验证和说明:
会话隔离的直观验证
测试代码
import { Connection, EntityManager, getConnection, QueryRunner } from 'typeorm'; const connection: Connection = getConnection('default'); const entityManager: EntityManager = connection.manager; const queryRunner: QueryRunner = connection.createQueryRunner(); await queryRunner.query(`SET SESSION group_concat_max_len = 2048`); const groupConcatMaxLen = await queryRunner.query(`SHOW VARIABLES LIKE 'group_concat_max_len'`); const groupConcatMaxLen2 = await entityManager.query(`SHOW VARIABLES LIKE 'group_concat_max_len'`); console.log(groupConcatMaxLen); console.log(groupConcatMaxLen2);
输出结果
[ RowDataPacket { Variable_name: 'group_concat_max_len', Value: '2048' } ] [ RowDataPacket { Variable_name: 'group_concat_max_len', Value: '1024' } ]
差异本质解析
- QueryRunner:创建后会独占一个独立的数据库连接会话,所有通过它执行的SQL都在这个专属会话中运行。会话级别的配置(比如示例中的MySQL会话变量)只会作用于该QueryRunner实例,不会影响其他连接或EntityManager。
- EntityManager:默认使用连接池中的共享连接,每次执行SQL可能从连接池复用不同的连接,且不会保留会话级别的自定义配置。因此它无法获取到QueryRunner中设置的会话变量值,始终读取默认配置。
适用场景
- 使用QueryRunner:需要执行事务操作、会话级专属配置或者需要确保一系列操作在同一个连接会话中完成的场景。
- 使用EntityManager:常规CRUD操作,依赖连接池的连接复用机制提升性能,无需维持会话状态的场景。
内容的提问来源于stack exchange,提问作者Jeff Pal
相关产品推荐
相关产品推荐

