返回

TypeORM数据库连接的管理与释放

前端

问题引入

在使用TypeORM进行数据库操作时,我遇到一个问题:当我在同一个请求中多次调用TypeORM.getConnection()方法获取数据库连接时,程序会报出Error: Cannot get connection from the pool, pool is destroyed的错误。

app.get('/user', async (req, res) => {
  // 第一次获取数据库连接
  const connection1 = await TypeORM.getConnection();
  // 第二次获取数据库连接
  const connection2 = await TypeORM.getConnection();

  // ... 执行数据库操作

  // 关闭第一个数据库连接
  connection1.close();
});

在上面的代码中,我们在同一个请求中两次调用TypeORM.getConnection()方法获取数据库连接。第一次获取到的连接是有效的,但是第二次获取到的连接却失效了。这是因为TypeORM在创建连接池时,默认的连接池大小为5。当我们第一次获取连接时,TypeORM会从连接池中取出一个连接并将其分配给我们。但是当我们第二次获取连接时,连接池中已经没有空闲的连接了。因此,TypeORM会抛出Error: Cannot get connection from the pool, pool is destroyed的错误。

排查思路

为了解决这个问题,我们需要了解TypeORM的连接池原理以及TypeORM在什么场景下需要手动释放连接。

TypeORM的连接池原理

TypeORM使用的是node-pool库来管理连接池。node-pool库是一个轻量级的连接池库,它可以帮助我们管理数据库连接,并自动释放闲置的连接。

TypeORM的连接池默认大小为5。当我们获取数据库连接时,TypeORM会从连接池中取出一个空闲的连接并将其分配给我们。当我们关闭数据库连接时,TypeORM会将该连接放回连接池中,以便其他请求可以重用它。

TypeORM中什么场景下需要手动释放连接?

在大多数情况下,TypeORM会自动管理连接池,我们不需要手动释放连接。但是,在某些情况下,我们需要手动释放连接,以避免资源泄露。

以下是一些需要手动释放连接的场景:

  • 当我们在同一个请求中多次调用TypeORM.getConnection()方法获取数据库连接时。
  • 当我们在请求结束之前没有关闭数据库连接时。
  • 当我们在使用事务时。

如何手动释放连接?

我们可以使用connection.close()方法来手动释放连接。例如:

app.get('/user', async (req, res) => {
  // 获取数据库连接
  const connection = await TypeORM.getConnection();

  // ... 执行数据库操作

  // 关闭数据库连接
  connection.close();
});

在上面的代码中,我们在使用完数据库连接之后,立即调用connection.close()方法来关闭连接。这样可以防止连接泄露。

结论

在使用TypeORM进行数据库操作时,我们需要了解TypeORM的连接池原理以及TypeORM在什么场景下需要手动释放连接。在大多数情况下,TypeORM会自动管理连接池,我们不需要手动释放连接。但是,在某些情况下,我们需要手动释放连接,以避免资源泄露。