升级到Postgres JDBC驱动程序42.2.10+时套接字超时不起作用

雅各布·赫索恩(Jakub Hesoun)

我有一个Java应用程序作为WAR文件部署到Tomcat中。查找到Postgres DB的数据源作为JNDI资源,并使用Tomcat的默认连接池-DBCP2。Resource在这样context.xml的定义中

<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
              maxTotal="50" maxIdle="15" maxWaitMillis="10000"
              username="test" password="test"
              driverClassName="org.postgresql.Driver"
              defaultReadOnly="true"
              url="jdbc:postgresql://localhost:5432/test?socketTimeout=45"
              validationQuery="SELECT 1" testOnBorrow="true" />

有一个名为的类DbConnectionChecker该类使用Executors.newSingleThreadScheduledExecutor()执行程序每3秒检查一次DB是否处于活动状态。

public class DbConnectionChecker {

    private static final Logger LOG = LoggerFactory.getLogger(DbConnectionChecker.class);
    private final ScheduledExecutorService taskExecutor;

    private String name;

    private DataSource dataSource;

    private volatile boolean enabled = false;

    public DbConnectionChecker(String name, DataSource dataSource, ScheduledExecutorService taskExecutor, Runnable onConnectionOk,
            Runnable onConnectionNoOk) {
        this.name = name;
        this.dataSource = dataSource;
        this.taskExecutor = taskExecutor;
        this.taskExecutor.scheduleAtFixedRate(() -> pingConnection(onConnectionOk, onConnectionNoOk), 0l, 3000l, TimeUnit.MILLISECONDS);
    }

    public void start() {
        LOG.info("Starting to check {} connection", name);
        enabled = true;

    }

    public void shutdown() {
        taskExecutor.shutdown();
    }

    public void stop() {
        enabled = false;
    }

    public void pingConnection(Runnable onConnectionOk, Runnable onConnectionNoOk) {
        if (!enabled) {
            return;
        }
        try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT 1")) {
            preparedStatement.executeQuery();
            LOG.info("Connection {} OK...", name);
            onConnectionOk.run();
        } catch (Exception e) {
            LOG.info("Connection {} couldn't be created...", name);
            onConnectionNoOk.run();
        }
    }
}

当一切开始后,我可以选择一条logline Connection test OK...,每3秒打印到日志中。到现在为止还挺好。

现在,我尝试模拟网络故障和无法访问的数据库。我将更改iptables并切断与本地Postgres的连接。

sudo iptables -A INPUT -i lo -p tcp --dport 5432 -j DROP

使用postgres-42.2.9时,一切都会按预期进行Connection test couldn't be created...,一分钟左右,我就会收到一条日志行升级到postgres-42.2.10 +之后-我已经测试了所有最新的次要版本,但此操作中断了。执行程序的线程卡在某些套接字调用中,并在那里等待aprox。放映前30分钟。相关的堆栈跟踪在这里

pool-14-thread-1@12955" prio=5 tid=0x45 nid=NA runnable"pool-14-thread-1@12955" prio=5 tid=0x45 nid=NA runnable  java.lang.Thread.State: RUNNABLE   at
java.net.SocketInputStream.socketRead0(SocketInputStream.java:-1)   at
java.net.SocketInputStream.socketRead(SocketInputStream.java:116)   at
java.net.SocketInputStream.read(SocketInputStream.java:171)   at
java.net.SocketInputStream.read(SocketInputStream.java:141)   at
sun.security.ssl.InputRecord.readFully(InputRecord.java:465)   at
sun.security.ssl.InputRecord.read(InputRecord.java:503)   at
sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)   - locked <0x3e55> (a java.lang.Object)   at
sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933)   at
sun.security.ssl.AppInputStream.read(AppInputStream.java:105)   - locked <0x3e37> (a sun.security.ssl.AppInputStream)   at
org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:161)   at
org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:128)   at
org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:113)   at
org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73)   at
org.postgresql.core.PGStream.receiveChar(PGStream.java:370)   at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2043)   at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:312)   - locked <0x3e3a> (a org.postgresql.core.v3.QueryExecutorImpl)   at
org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448)   at
org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369)   at
org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:153)   at
org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:103)   at
org.apache.tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.java:287)   at
org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:630)   at
org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateObject(PoolableConnectionFactory.java:648)   at
org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:476)   at
org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:353)   at
org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)   at
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:753)   at
com...db.DbConnectionChecker.pingConnection(DbConnectionChecker.java:49)   at
com...db.DbConnectionChecker.lambda$new$0(DbConnectionChecker.java:28)   at
com...db.DbConnectionChecker$$Lambda$250.1931785101.run(Unknown Source:-1)   at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)   at
java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:308)   at
java.util.concurrent.FutureTask.runAndReset(FutureTask.java:-1)   at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)   at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)   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) 

最新的postgres驱动程序有问题吗?是否有我不知道的超时(默认设置)?

我们是万

我在pgjdbc的github问题中得到了答案。您可以参考此问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

升级到Windows 10后WMI不起作用

来自分类Dev

升级到Yii2,ORM不起作用

来自分类Dev

realtek rtl8723be wifi 驱动程序在升级到 5.4.0-37 后不起作用

来自分类Dev

将操作系统升级到8时是否应该备份驱动程序?

来自分类Dev

升级到Windows 10后没有自动安装驱动程序:系统策略禁止安装此设备

来自分类Dev

从7升级到Windows 10后,在映像设备下找不到WEBCAM驱动程序

来自分类Dev

升级到rc2后,Angular2快速入门应用程序不再起作用

来自分类Dev

升级到Windows 10时MySQL实例丢失

来自分类Dev

参数无效-升级后Brother扫描仪不起作用(brscan2驱动程序)

来自分类Dev

参数无效-升级后Brother扫描仪不起作用(brscan2驱动程序)

来自分类Dev

内核升级后 Displaylink 驱动程序不起作用

来自分类Dev

从 18.04 升级到 20.04 后,Alt-F2 不起作用

来自分类Dev

我可以在Xubuntu 18.04中将ath9k驱动程序升级到ath10k吗?

来自分类Dev

升级到15.04后出现了奇怪的驱动程序

来自分类Dev

从Angular 9升级到10后自定义CDK步进器不起作用

来自分类Dev

升级到Windows 10 Pro后,Thinkpad T470触摸板按钮不起作用

来自分类Dev

在IE10中升级到Angular2 RC5后,没有提供PlatformRef错误的提供程序

来自分类Dev

在IE10中升级到Angular2 RC5后,没有提供PlatformRef错误的提供程序

来自分类Dev

升级到角度应用程序到v10错误

来自分类Dev

将Windows 8.1升级到10后修复grub2(奇怪的情况)

来自分类Dev

升级到Windows 10后,存储驱动器发出半定期的咔嗒声

来自分类Dev

将Spring Boot版本从1.3.5升级到1.4.2后,DB2ZOS方言不起作用

来自分类Dev

Wildfly 10 Final postgres驱动程序ClassCastException

来自分类Dev

升级到Windows 10会取代我的grub引导程序吗?

来自分类Dev

升级到Windows 10后我的程序停止工作

来自分类Dev

升级到 Xcode 10 GM 种子后,EstimoteProximitySDK 使我的应用程序崩溃

来自分类Dev

将Postgres从10升级到12-编码问题

来自分类Dev

从API 10升级到API 16时,Android菜单按钮消失了

来自分类Dev

Windows 7 XP模式文件在升级到Windows 10时丢失

Related 相关文章

  1. 1

    升级到Windows 10后WMI不起作用

  2. 2

    升级到Yii2,ORM不起作用

  3. 3

    realtek rtl8723be wifi 驱动程序在升级到 5.4.0-37 后不起作用

  4. 4

    将操作系统升级到8时是否应该备份驱动程序?

  5. 5

    升级到Windows 10后没有自动安装驱动程序:系统策略禁止安装此设备

  6. 6

    从7升级到Windows 10后,在映像设备下找不到WEBCAM驱动程序

  7. 7

    升级到rc2后,Angular2快速入门应用程序不再起作用

  8. 8

    升级到Windows 10时MySQL实例丢失

  9. 9

    参数无效-升级后Brother扫描仪不起作用(brscan2驱动程序)

  10. 10

    参数无效-升级后Brother扫描仪不起作用(brscan2驱动程序)

  11. 11

    内核升级后 Displaylink 驱动程序不起作用

  12. 12

    从 18.04 升级到 20.04 后,Alt-F2 不起作用

  13. 13

    我可以在Xubuntu 18.04中将ath9k驱动程序升级到ath10k吗?

  14. 14

    升级到15.04后出现了奇怪的驱动程序

  15. 15

    从Angular 9升级到10后自定义CDK步进器不起作用

  16. 16

    升级到Windows 10 Pro后,Thinkpad T470触摸板按钮不起作用

  17. 17

    在IE10中升级到Angular2 RC5后,没有提供PlatformRef错误的提供程序

  18. 18

    在IE10中升级到Angular2 RC5后,没有提供PlatformRef错误的提供程序

  19. 19

    升级到角度应用程序到v10错误

  20. 20

    将Windows 8.1升级到10后修复grub2(奇怪的情况)

  21. 21

    升级到Windows 10后,存储驱动器发出半定期的咔嗒声

  22. 22

    将Spring Boot版本从1.3.5升级到1.4.2后,DB2ZOS方言不起作用

  23. 23

    Wildfly 10 Final postgres驱动程序ClassCastException

  24. 24

    升级到Windows 10会取代我的grub引导程序吗?

  25. 25

    升级到Windows 10后我的程序停止工作

  26. 26

    升级到 Xcode 10 GM 种子后,EstimoteProximitySDK 使我的应用程序崩溃

  27. 27

    将Postgres从10升级到12-编码问题

  28. 28

    从API 10升级到API 16时,Android菜单按钮消失了

  29. 29

    Windows 7 XP模式文件在升级到Windows 10时丢失

热门标签

归档