祝所有志同道合或知识渊博的人美好的一天。
我正在尝试在 Web 服务器中实现 H2 数据库连接(数据库在服务器模式下运行,因此我可以通过 TCP/IP 建立多个连接),我发现自己每次都处于相同的状态,该函数被调用并且它以 pending 状态返回承诺,我留下一个等待,最终只是一直走下去,而没有从查询中得到答案。
我使用的堆栈是
函数的调用
userModel.getUsers();
函数getUsers
try {
const connection = await h2.getInstance().getConnection();
console.log('Connection established');
return connection.query('SELECT * FROM USERS');
} catch (error) {
console.error(error);
throw error;
}
H2 连接 类,您将看到我正在使用 pg 库来处理连接,因为它可以通过 TCP/IP 完成,但也尝试使用 jdbc 获得相同的结果。
class H2Connection {
// Use a private static field to store the instance
static #instance = null;
// Use a private constructor to prevent direct instantiation
constructor() {
this.connection = new pg.Client(h2Conf);
this.connection.connect();
}
static getInstance() {
// If the instance does not exist, create a new one
if (H2Connection.#instance == null) {
H2Connection.#instance = new H2Connection();
}
// Return the instance
return H2Connection.#instance;
}
// Use a method to get the connection
getConnection() {
return this.connection;
}
}
希望有人能帮助我解决这个问题。
尝试过:
预期:
看起来你的连接工厂可以简化,我无法重现完整的场景,但是
connection.query()
需要先有一个与this.connection.connect();
连接的数据库实例,这是一个Promise,但你不等待它在致电return connection.query('SELECT * FROM USERS');
之前完成。
您可以做的是使用单例设计模式构建可重用的连接实例,并在整个项目中全局使用它。实例化单例后的一件重要事情是在运行查询之前调用一个方法来设置它/等待连接建立,例如
waitConnection()
,因为禁止的异步构造函数的设计存在限制,我建议看一下。我提出的解决方案是这样的:
database-driver.js
:
const pg = require("pg");
const connectionString = "..."
class H2ConnectionFactory {
constructor(h2ConnectionString) {
this.connection = new pg.Client(h2ConnectionString);
}
async waitConnection() {
await this.connection.connect();
}
getConnection() {
return this.connection;
}
}
export const dbSingleton = new H2ConnectionFactory(connectionString);
main.js
:
import { dbSingleton } from "./database-driver";
async function getAnyData() {
try {
const connection = dbSingleton.getConnection();
console.warn('query rows result:', (await connection.query('SELECT NOW()')).rows);
} catch (error) {
console.error(error);
throw error;
}
};
async function main() {
await dbSingleton.waitConnection();
console.log('Connection established');
getAnyData();
}
main()
所以代码的顺序是:
希望有帮助。