我在节点Js应用程序中使用typeorm和typescript。我试图找出为类中的所有函数使用单个DB连接的方法。例如,我有两个函数我的类,并希望对所有函数使用全局/单连接,而不是在每个函数中创建连接,如下所示:
export class SQLDBService implements IDatabaseService{
private readonly logger = getLogger("SQLDBService");
private connection:Connection;
getConversation(conversationId: string): ConversationEntity {
let conversationEntity = new ConversationEntity();
createConnection(/*...*/).then(async connection => {
let dbObj = await connection.getRepository(ConversationEntity).findOne({
conversationId: Equal(conversationId)
});
if(dbObj)
conversationEntity = dbObj;
});
return conversationEntity;
}
pushWrapUp(conversationId: string, wrapUp: string): void {
createConnection().then(async connection => {
let conversationEntity = await connection.getRepository(ConversationEntity).findOne({
conversationId: Equal(conversationId)
});
if(conversationEntity){
conversationEntity.wrapUp = wrapUp;
conversationEntity.endTime = new Date();
await connection.manager.save(conversationEntity);
}
});
}}
有人能指出我正确的方向吗?
答案 0 :(得分:2)
上面的代码没有有效地使用async..await
因为promises没有链接,导致错误处理不当和控制流程不正确。
正如the documentation所解释的那样,
应用程序初始化时,TypeORM的Connection不会像看起来那样设置数据库连接,而是设置连接池。 < ...>一旦调用Connection的connect方法,就建立连接池设置。如果使用createConnection函数设置连接,则会自动调用connect方法。调用close时会断开连接(关闭池中的所有连接)。通常,您必须在应用程序引导程序中仅创建一次连接,并在完全使用数据库后关闭它。
createConnection
应该只被调用一次。由于它是异步的,因此初始化例程应该在使用TypeORM模型之前等待它。
正如文档所示,可以使用getConnection()
代替createConnection
。由于目的是获取默认连接的存储库,因此可以使用getRepository
代替:
这是:
import {getRepository} from "typeorm";
...
async getConversation(conversationId: string): ConversationEntity {
let conversationEntity = new ConversationEntity();
let dbObj = getRepository(ConversationEntity).findOne({
conversationId: Equal(conversationId)
});
if(dbObj) conversationEntity = dbObj;
return conversationEntity;
}
答案 1 :(得分:0)
这种相当少的重构应该可以解决问题
export class SQLDBService implements IDatabaseService {
private readonly logger = getLogger("SQLDBService");
private connection:Connection;
init() {
this.connection = await createConnection(/*...*/)
}
getConversation(conversationId: string): ConversationEntity {
let conversationEntity = new ConversationEntity();
let dbObj = await this.connection.getRepository(ConversationEntity).findOne({
conversationId: Equal(conversationId)
});
if(dbObj)
conversationEntity = dbObj;
return conversationEntity;
}
pushWrapUp(conversationId: string, wrapUp: string): void {
let conversationEntity = await this.connection.getRepository(ConversationEntity).findOne({
conversationId: Equal(conversationId)
});
if(conversationEntity){
conversationEntity.wrapUp = wrapUp;
conversationEntity.endTime = new Date();
await this.connection.manager.save(conversationEntity);
}
}
}
const db = new SQLDBService()
try {
await db.init()
}
catch (error) {
console.error("db connection error")
console.error(error)
console.error("db connection error")
}
答案 2 :(得分:-1)
您应该使用全局连接池,它将为您创建,保留和处理已使用的连接。我不熟悉node.js,所以我不能给出这种第三方库的名称。但必须有一些,因为连接池是一种被广泛接受的设计模式。