【问题标题】:Postgresql 8.4 occasional hang with JDBC accessPostgresql 8.4 偶尔挂起 JDBC 访问
【发布时间】:2011-10-27 15:18:00
【问题描述】:

我有一个数据库密集型应用程序,它运行数小时并使用多个线程,所有线程都通过 JDBC 与 Postgresql 通信。我看到的症状是偶尔(每次“运行”一到三次)我最终会遇到一个或多个卡住的 JDBC 连接,这些连接似乎正在等待来自数据库的响应,但似乎永远在等待。线程转储如下:

"Thread-4367355" daemon prio=6 tid=0x04920c00 nid=0x1e88 runnable [0x04bef000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:135)
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104)
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73)
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:255)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1165)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:191)
    - locked <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:337)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:329)

我会想到某种锁定问题,除了很多时候只有一个线程被卡住。我在这种状态下看到的至少一个查询是 REINDEX,因此查询可能需要相当长的时间。为了找到解决方案,我将 JDBC 驱动程序从 8.4 升级到 9.1,但问题仍然存在。 Postgresql 日志中也没有什么异常。进一步诊断的任何想法(除了使用 pg_locks)?

【问题讨论】:

  • 您解决问题了吗?我们在 9.1 也面临同样的“挂起”
  • 我遇到了同样的问题,Postgresql 8.4,JDBC 驱动程序 9.1。该查询是一个复杂的删除。服务器上的进程开始使用 100% 的 CPU,然后突然下降到 0% 并永远保持在 0%。客户端线程和上面一样卡住了。
  • 请注意,如果它挂起并说“BLOCKED waiting for object XXX”,这可能意味着您的 postgres 连接正试图被多个线程使用[当然在这种情况下不是这种情况,就像一个注释]

标签: postgresql jdbc freeze


【解决方案1】:

您可以尝试一个显而易见的事情:也将 PostgreSQL 本身更新到 9.1 版。
你也可以记录所有long running statements,这可能会给你一个线索。

Set log_min_duration_statement = 2000

或任何适合您的阈值。
我不知道如何解释线程转储,但这行看起来很奇怪:

  • 锁定 (一个 org.postgresql.core.v3.QueryExecutorImpl)

什么是锁定的?你会注意到它是如何拼错“在 org.postgresql.cor...”的。那是复制粘贴的人工制品还是原始消息?如果是这样,可能有助于找到原点。

【讨论】:

  • locked 表示该方法获得了一个锁,它是一个 org.postgresql.core.v3.QueryExecutorImpl 对象。而十六进制是锁的地址?
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 2023-03-23
  • 1970-01-01
  • 2014-07-15
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多