java - PuppetDB 和 PostgreSQL - 不支持事务隔离级别 4

标签 java postgresql unix jdbc puppet

场景: 我的旧配置是 SLES11 PuppetMaster 3.7.5 服务器和 SLES11 PuppetDB 2.3.3 服务器(PostgreSQL 9.4、JDBC 9.1 和 JDK 1.7),运行没有问题。

我还安装了一个新的测试 SLES12,以查看 PostgreSQL 10 是否可以与我们的 PuppetDB 配合使用。 当 PuppetDB 尝试远程连接/写入时,它会给出错误“不支持事务隔离级别 4”

根据链接,postgresql Transaction isolation level 4 not supported我的 JDBC 驱动程序很旧。

我尝试将它们更新到 JBDC 42.2,但无论是远程 PostgreSQL 10 还是本地 PostgreSQL 9.4(对于 JDBC 9.1 都没有问题),它仍然给出相同的错误。

最佳答案

java.sql.Connection.TRANSACTION_REPEATABLE_READ 为 4。

commit 67ee14e879d 中引入了对REPEATABLE READ 的支持2004 年 1 月 13 日,除非我弄错了:

                else
                {
-                       isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ";
-                       switch (isolationLevel)
-                       {
-                               case Connection.TRANSACTION_READ_COMMITTED:
-                                       isolationLevelSQL += "READ COMMITTED";
-                                       break;
-                               case Connection.TRANSACTION_SERIALIZABLE:
-                                       isolationLevelSQL += "SERIALIZABLE";
-                                       break;
-                               default:
-                                       throw new PSQLException("postgresql.con.isolevel", PSQLState.TRANSACTION_STATE_INVALID,
-                                                                                       new Integer(isolationLevel));
-                       }
+                       isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL " + getIsolationLevelName(level);
                }
                execSQL(isolationLevelSQL);
+               isolationLevel = level;
+       }
+
+       protected String getIsolationLevelName(int level) throws SQLException
+       {
+               boolean pg75 = haveMinimumServerVersion("7.5");
+
+               if (level == Connection.TRANSACTION_READ_COMMITTED) {
+                       return " READ COMMITTED";
+               } else if (level == Connection.TRANSACTION_SERIALIZABLE) {
+                       return " SERIALIZABLE";
+               } else if (pg75 && level == Connection.TRANSACTION_READ_UNCOMMITTED) {
+                       return " READ UNCOMMITTED";
+               } else if (pg75 && level == Connection.TRANSACTION_REPEATABLE_READ) {
+                       return " REPEATABLE READ";
+               }
+               throw new PSQLException("postgresql.con.isolevel", PSQLState.TRANSACTION_STATE_INVALID, new Integer(level));
        }

所以我假设您无意中使用了一些非常旧的 JDBC 驱动程序。

关于java - PuppetDB 和 PostgreSQL - 不支持事务隔离级别 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58269396/

相关文章:

java - 为什么有些服务器同时运行 Tomcat 和 Apache Web Server?

PostgreSQL 喜欢不返回匹配的实例

linux - 文本文件中的平均行/列数据

postgresql - Azure PostgreSQL - 如何创建管理员用户

sql - 不使用循环计算行程次数

C 程序在尝试写入 stdout 后退出

linux - 对非 root 用户使用终端快捷方式

java - 覆盖依赖项中可用的 log4j 配置以运行单元/集成测试

java - 将双数舍入为指定模式

java - 操作系统版本范围的 Maven 配置文件