我有一个目前部署在AWS上的lambda。它是一个简单的CRUD逻辑,位于API网关后面。
我目前面临的问题是,只要流量达到峰值,我的数据库上的连接就会出现。
我知道这是因为并行调用了很多lambda,并打开了它们各自的连接,但有没有办法可以在这里进行某种连接池化?
以下主题说明我可以(如果我在智能上稍微编码一些容器中的某种连接池):
How we can use JDBC connection pooling with AWS Lambda?
但它并不保证任何东西。
我可以在我的lambda中对此做些什么,或者必须使用外部连接池(我使用Postgres,那应该是pg_bouncer)?
答案 0 :(得分:1)
是的,没办法绕过它。你需要使用pgBouncer。
答案 1 :(得分:0)
是的,您必须自己管理连接池。我之前使用c3p0库来使其工作。以下是一个示例代码段:
private static final QueryRunner queryRunner;
然后在处理程序方法体外的某处使用以下内容初始化查询运行程序:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setUser(System.getenv("USERNAME"));
dataSource.setPassword(System.getenv("PASSWORD"));
queryRunner = new QueryRunner(dataSource);
如果要在lambda函数中查询,请调用:
List<Map<String, Object>> result = queryRunner.query("SELECT * FROM schema.users WHERE column = vall", new MapListHandler());
希望这有帮助。
另外,请记住,重新部署函数时,可能无法在以后回收活动的jdbc连接。这可能不是问题,具体取决于使用jdbc连接的函数数量以及数据库可以支持的数量。