【问题标题】:How to define lock wait time for Postgres 9.0?如何定义 Postgres 9.0 的锁定等待时间?
【发布时间】:2014-10-10 16:21:18
【问题描述】:

我正在执行一些测试来评估我们的 DAO 层的框架。其中一个测试用例是复制表锁并检查框架在这种情况下的行为方式。这些测试是使用 Java 完成的,主要是 JPA,使用 Hibernate 和 EclipseLink 作为 JPA 供应商,我们也单独使用 Hibernate,我们有一组接口作为框架的桥梁,以简化我们针对任何其他 ORM 框架的测试。

我已经成功地针对我们的 MySQL 5.5.11 数据库生成了一个表锁定测试用例,这是因为运行测试用例的应用程序刚刚冻结了 50 秒(MySQL 中锁定等待时间的默认值),然后出现了与相关的 SQLException日志中出现表锁等待超时异常。然后我切换测试的配置连接到 Postgres 9.0 并重新执行测试,我可以复制表锁但现在应用程序只是冻结了 10 分钟,没有抛出异常,所以我不得不停止测试执行.

我正在搜索如何为 Postgres 9.0 更改这个时间,并在此处获得了 Postgres 9.3 的结果:Client Connection Defaults under lock_timeout。然后我检查了 9.0 的文档,并且没有这样的参数。您知道如何在 postgres 配置或我的 Java 客户端应用程序中更改它,可能是 JPA 或 Hibernate 或 EclipseLink 特定配置,只是为了检查数据库中的表锁定异常?最糟糕的情况是生产环境中出现表锁,除非应用程序停止(这是我们与框架一起测试的),否则我们无法从中恢复。

【问题讨论】:

    标签: java hibernate postgresql jpa postgresql-9.0


    【解决方案1】:

    试试statement_timeout - 它已经存在很长时间了。

    SET statement_timeout=1000;
    -- try to take lock, and get an exception 1000ms later
    

    【讨论】:

    • 这很相似,但又不一样。我没有得到锁表异常,但我想这是我能得到的最接近这个版本的 Postgres。
    • 如果您只关心锁定错误而不是超时,您可以在锁定尝试中添加NOWAIT
    • 是的,这是您在 9.0 上最接近的版本。是时候升级了。
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多