setReadOnly 不适用于 PostgreSQL 连接

setReadOnly not working on PostgreSQL Connection

我在使用 JDBC.

设置与 PostgreSQL 数据库的只读连接时遇到问题

我正在创建一个加载查询以从文件执行的应用程序,我只想执行 SELECT(只读)查询。为将 运行 应用程序的用户设置权限不是一个选项,因此通过 Connection.setReadOnly(boolean) 方法在代码级别设置权限是我能想到的唯一选项。

现在的问题是我尝试了插入和删除查询的应用程序,它们 运行 正常,所以我的解决方案不起作用。

有什么解决问题的技巧吗?

下面是我正在测试的简单代码片段:

public class Test{

public static void main(String[] args) {
    connectAndExecute();
}

public static void connectAndExecute() {
    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
        return;
    }

    Connection connection;

    String connString = "jdbc:postgresql://localhost:5432/testdb";
    try {
        connection = DriverManager.getConnection(connString, "user", "password");
    } catch (SQLException e) {
        e.printStackTrace();
        return;
    }

    try {
        connection.setReadOnly(true);
        connection.createStatement().execute("delete from testtable");
        // connection.createStatement().execute("insert intotesttable(testfield1)values('test')");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

这是我正在使用的 JDBC 驱动程序

<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.10</version>

PostgreSQL 版本:11.6

问题似乎与驱动程序的错误有关。

这两个解决方法都对我有用:

  • kayaman 提议:

首先执行 sql 命令

SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
  • 由a_horse_with_no_name提议:

禁用自动提交使 setReadOnly 调用生效

Connection.setAutoCommit(false);
Connection.setReadOnly(true);

明确一点:setReadOnly 方法的规范并非旨在防止更新数据库。

正如 Java 的 API 所说:

https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#setReadOnly-boolean-

“将此连接置于 read-only 模式,以提示驱动程序启用数据库优化”

因此,依靠这种方法来保护与只读事务需要相关的任何东西都不是一个好主意:)