java - 使用 Java 连接池的 AWS IAM 数据库身份验证
问题描述
我正在寻找一个 Java 数据库连接池,它允许我为我的 Aurora MySQL 使用 AWS IAM 数据库身份验证。该池应该能够工作 Tomcat 的 context.xml 文件。
我看过 Tomcat DBCP、dbcp2、HikariCP 和 c3p0。但他们似乎都假设用户名和密码在应用程序启动时是已知的,并且在应用程序的生命周期内不会改变。
对于 IAM 数据库身份验证,凭证每 15 分钟更改一次,因此池需要在创建新连接时向 AWS IAM 请求新凭证(凭证可能会缓存几分钟。)。
这是否在任何 Java 连接池中实现?或者你知道如何让它发挥作用吗?
解决方案
我还不得不使用 node js lambda 和 MySql RDS 来面对这个问题。我们正在使用mysql连接池,因此我们实施了一个解决方案,该解决方案创建了一个未来的日期时间,我们可以检查连接是否即将到期,无论何时从池中请求连接。这个日期时间是 15 分钟减去连接池初始化后的一些抖动。
所以获取连接池(获取连接)看起来像:
const getPool = async (): Promise<DbConnectionPool> => {
if (isRdsIamTokenCloseToExpiring()) {
await poolHolder.lock.acquire();
try {
// if, after having acquired lock, thread pool is still about to expire...
if (isRdsIamTokenCloseToExpiring()) {
await closeConnectionsInPool();
await initializeConnectionPool();
}
} finally {
poolHolder.lock.release();
}
}
if (!poolHolder.pool) {
throw new Error('pool holder is null - this should never happen');
} else {
return poolHolder.pool;
}
};
因为我们有多个并发异步线程试图获得连接,所以我们必须引入一个信号量来控制池的重新初始化。总而言之,这样做比使用用户名和密码更麻烦,但更安全。
要回答 Isen Ng 的上述评论(我没有代表直接回答),RDS IAM 令牌过期的连接将停止工作。
推荐阅读
- c++ - 如何将地图作为不可变地图传递?
- python - 在 Qt5 日历小部件中突出显示日期间隔
- amazon-ec2 - 在 Amazon Linux EC2 中安装 minikube kubernates 时出错
- python - 在 lpthw ex42 中没有获得 self.start_scene
- android - 如何修复使用 AMAP SDK 的不合规 Android 应用
- jquery - 使用 jQuery 隐藏 Div 并滚动到锚点
- python - 如何使用python连接文件夹中的所有音频(.wav)文件?
- go - 如何从 http.Request 的响应中读取文件内容
- google-chrome-extension - 如何在 Chrome.i18n 消息字符串中添加换行符
- javascript - 如何在 htmlstring 中传递 javascript 数组的值以更改 innerHTML