如何使用无服务器框架在Lambda中管理Aurora无服务器数据api的typeORM连接

时间:2020-07-17 09:23:02

标签: aws-lambda serverless-framework typeorm aws-aurora-serverless

我正在使用:

  • Aurora无服务器数据API(Postgres)
  • 带有typeorm-aurora-data-api-driver的TypeORM
  • 具有无服务器框架(TypeScript,WebPack)的AWS Lambda

我正在按照github中的描述连接到数据库,

    public static void main(String[] args) throws IOException, InterruptedException {
        DatagramSocket ds = new DatagramSocket();
        byte[] data = "Hello".getBytes();
        DatagramPacket p = new DatagramPacket(data, data.length);
        String server = "192.168.1.5";
        p.setAddress(InetAddress.getByName(server));
        p.setPort(10086);
        ds.send(p);
        Thread.sleep(1);
        data = "world".getBytes();
        p = new DatagramPacket(data, data.length);
        p.setAddress(InetAddress.getByName(server));
        p.setPort(10086);
        ds.send(p);
    }

这就是我在Lambda函数中使用它的方式

A client connect: 38394, 192.168.1.2, 2 with msg: Hello.
A client connect: 38394, 192.168.1.2, 2 with msg: world.

我第一次执行时效果很好。

但是第二次和下一次我遇到错误

const connection = await createConnection({
      type: 'aurora-data-api-pg',
      database: 'test-db',
      secretArn: 'arn:aws:secretsmanager:eu-west-1:537011205135:secret:xxxxxx/xxxxxx/xxxxxx',
      resourceArn: 'arn:aws:rds:eu-west-1:xxxxx:xxxxxx:xxxxxx',
      region: 'eu-west-1'
    })

那么,管理此连接的正确方法是什么? 应该以某种方式重用吗?

我已经找到了一些简单RDS的解决方案,但是Aurora Serverless 数据API 的全部目的是您不必管理连接

1 个答案:

答案 0 :(得分:0)

当您尝试建立连接时,需要检查它是否已经可以使用连接。这是我的Database类,用于处理连接

export default class Database {
  private connectionManager: ConnectionManager;

  constructor() {
    this.connectionManager = getConnectionManager();
  }

  async getConnection(): Promise<Connection> {
    const CONNECTION_NAME = 'default';

    let connection: Connection;

    if (this.connectionManager.has(CONNECTION_NAME)) {
      logMessage(`Database.getConnection()-using existing connection::: ${CONNECTION_NAME}`);
      connection = await this.connectionManager.get(CONNECTION_NAME);

      if (!connection.isConnected) {
        connection = await connection.connect();
      }
    } else {
      logMessage('Database.getConnection()-creating connection ...');
      logMessage(`DB host::: ${process.env.DB_HOST}`);

      const connectionOptions: ConnectionOptions = {
        name: CONNECTION_NAME,
        type: 'postgres',
        port: 5432,
        logger: 'advanced-console',
        logging: ['error'],
        host: process.env.DB_HOST,
        username: process.env.DB_USERNAME,
        database: process.env.DB_DATABASE,
        password: process.env.DB_PASSWORD,
        namingStrategy: new SnakeNamingStrategy(),
        entities: Object.keys(entities).map((module) => entities[module]),
      };

      connection = await createConnection(connectionOptions);
    }

    return connection;
  }
}