WSO2 EI Docker容器连接Amazon RDS PostgreSQL间歇性UnknownHostException求助
间歇性Amazon RDS(PostgreSQL)连接失败问题(WSO2 EI 6.4.0 Docker环境)
在WSO2 EI 6.4.0 Docker容器中使用Amazon RDS(PostgreSQL)进行数据库操作时,大部分场景正常,但间歇性抛出java.net.UnknownHostException,无法解析RDS主机yyyy.xxx.us-west-1.rds.amazonaws.com。
完整异常堆栈
[2024-03-25 04:30:08,007] [-1234] [] [pool-28-thread-16661] ERROR {org.apache.synapse.mediators.db.DBLookupMediator} - SQL Exception occurred while executing statement : select column1,column2 from schema.tabel_name where task_name=? against DataSource : jdbc/DSETL org.postgresql.util.PSQLException: The connection attempt failed. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:354) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54) at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:263) at org.postgresql.Driver.makeConnection(Driver.java:444) at org.postgresql.Driver.connect(Driver.java:297) at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:278) at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182) at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:730) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:664) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:200) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128) at org.apache.synapse.mediators.db.DBLookupMediator.processStatement(DBLookupMediator.java:58) at org.apache.synapse.mediators.db.AbstractDBMediator.mediate(AbstractDBMediator.java:233) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70) at org.apache.synapse.config.xml.AnonymousListMediator.mediate(AnonymousListMediator.java:37) at org.apache.synapse.config.xml.SwitchCase.mediate(SwitchCase.java:69) at org.apache.synapse.mediators.filters.SwitchMediator.mediate(SwitchMediator.java:134) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70) at org.apache.synapse.mediators.filters.FilterMediator.mediate(FilterMediator.java:169) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70) at org.apache.synapse.mediators.template.TemplateMediator.mediate(TemplateMediator.java:104) at org.apache.synapse.mediators.template.InvokeMediator.mediate(InvokeMediator.java:148) at org.apache.synapse.mediators.template.InvokeMediator.mediate(InvokeMediator.java:84) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70) at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:224) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) at org.apache.synapse.startup.tasks.MessageInjector.execute(MessageInjector.java:321) at org.wso2.carbon.mediation.ntask.NTaskAdapter.execute(NTaskAdapter.java:98) at org.wso2.carbon.ntask.core.impl.TaskQuartzJobAdapter.execute(TaskQuartzJobAdapter.java:67) at org.quartz.core.JobRunShell.run(JobRunShell.java:213) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.net.UnknownHostException: yyyy.xxx.us-west-1.rds.amazonaws.com at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at org.postgresql.core.PGStream.createSocket(PGStream.java:243) at org.postgresql.core.PGStream.<init>(PGStream.java:98) at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:132) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:258) ... 39 more
已尝试的修复步骤
- 将PostgreSQL驱动版本从42.2.0升级至42.7.0
- 在CAR项目的pom.xml中添加以下依赖并重新部署:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.7.0</version> </dependency>
问题仍间歇性出现,以下是可行的解决思路:
解决思路
1. 排查DNS解析稳定性
- 在Docker容器内部间歇性执行
nslookup yyyy.xxx.us-west-1.rds.amazonaws.com或dig yyyy.xxx.us-west-1.rds.amazonaws.com,确认DNS解析是否存在失败情况 - 修改Docker容器
/etc/resolv.conf,更换为更可靠的DNS服务器(如AWS内部DNS、8.8.8.8) - 调整JVM参数缩短DNS缓存时间:添加
-Dnetworkaddress.cache.ttl=60,避免缓存过期的DNS记录
2. 优化数据库连接池配置
针对数据源jdbc/DSETL调整以下参数:
- 配置
validationQuery=SELECT 1,开启testOnBorrow=true,确保每次获取连接时验证有效性 - 调整
timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis,定期清理空闲无效连接 - 设置
maxWait参数,避免线程无限等待连接
3. 验证网络连通性
- 检查Docker容器所在VPC与RDS实例的网络规则,确认无间歇性防火墙/安全组变更
- 查看AWS RDS监控指标(CPU、连接数、网络流量),排查实例是否存在临时性能瓶颈
- 在容器内持续执行
ping yyyy.xxx.us-west-1.rds.amazonaws.com或telnet yyyy.xxx.us-west-1.rds.amazonaws.com 5432,记录丢包或超时情况
4. 确认驱动加载优先级
- 检查WSO2 EI容器
<EI_HOME>/repository/components/lib目录,确保仅存在postgresql-42.7.0.jar,无旧版本驱动 - 验证CAR包部署后,驱动是否正确覆盖容器内的旧文件
5. 启用详细日志排查
- 在WSO2 EI的
log4j.properties中开启PostgreSQL驱动DEBUG日志,或DNS解析相关日志,定位失败触发条件 - 关联异常发生时间与AWS云监控事件,排查是否存在关联触发因素
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

