postgresql - Postgres 自动切换到只读模式 - 错误:无法在只读事务中执行更新
问题描述
当我通过负载测试工具点击 REST API 来增加 PostgreSQL 服务器上的负载时。Postgres 开始抛出异常ERROR: cannot execute UPDATE in a read-only transaction
。一旦它开始抛出异常,即使我尝试直接对 PG SQL 命令行执行更新查询,也会在那里抛出相同的异常。然后大约 5-10 分钟后,它会自动进入正常模式。
在测试套件中,我有多个 API 在各种表上执行多个选择、更新、插入操作。在这里,我们有一个这样的表,其中有一列具有bytea数据类型的列,以二进制格式存储一个 excel 文件。不知道这些信息是否相关。
但我担心的是为什么 Postgres 会自动切换到只读模式,这会导致我的 API 突然失败。这是一个间歇性问题,我们需要增加数据库服务器上的大量负载来复制它。我不确定它是否由于 LOAD 或上面提到的“bytea”列有大量二进制数据导致此类问题?
PostgreSql 版本:12
PG 驱动:42.2.18
请问有什么建议或线索吗?以下是日志:
Caused by: org.hibernate.exception.GenericJDBCException: could not execute statement
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3281) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3183) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
......
....
Caused by: org.postgresql.util.PSQLException: ERROR: cannot execute UPDATE in a read-only transaction
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553) ~[postgresql-42.2.18.jar:42.2.18]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285) ~[postgresql-42.2.18.jar:42.2.18]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323) ~[postgresql-42.2.18.jar:42.2.18]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473) ~[postgresql-42.2.18.jar:42.2.18]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393) ~[postgresql-42.2.18.jar:42.2.18]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164) ~[postgresql-42.2.18.jar:42.2.18]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130) ~[postgresql-42.2.18.jar:42.2.18]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-2.4.5.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-2.4.5.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
... 46 common frames omitted
解决方案
推荐阅读
- typescript - ts-node-dev 不重新加载某些文件
- powershell - Powershell shell window runs even if am closing the GUI form
- laravel - 如何在 Google App Engine 上使用 Laravel 写入 /tmp/framework/sessions
- reactjs - 如何使用 useState 钩子计算数组中项目的频率(React useState 钩子)?
- r - 如何使用 ggplot2 在绘图中添加线条
- amazon-web-services - Boto3 SNS不一致行为发布短信
- yup - 如何自定义 yup 验证消息?
- django - 向 ModelSerializer 添加额外字段
- c++ - 为什么指针显示的是值而不是地址?
- django - Stripe - 为客户创建新卡