使用 PostgreSQL 时 isReadOnly JDBC 参数的行为是什么?

Tia*_*ins 7 java postgresql jdbc

Java JDBC Connection 类允许设置一个名为 readOnly 的参数,但它有什么用呢?

根据JDBC 文档

readOnly 用于将连接置于只读模式

根据HikariCP 文档

此属性控制默认情况下从池中获取的连接是否处于只读模式。请注意,某些数据库不支持只读模式的概念,而其他数据库在 Connection 设置为只读时提供查询优化。您是否需要此属性在很大程度上取决于您的应用程序和数据库。默认值:假

但是什么是只读模式下的连接?概念是什么?只允许 SELECT 语句的连接?

只读连接是否为 PostgreSQL JDBC 驱动程序提供任何好处?

vbe*_*nar 6

您可以在github上浏览 PostgreSQL JDBC 驱动程序。Connection.setReadOnly 的实现表明当您调用该方法时,以下 SQL 语句之一发送到数据库:

SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
Run Code Online (Sandbox Code Playgroud)

或者

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
Run Code Online (Sandbox Code Playgroud)

现在,如果我们要阅读PostgreSQL 参考,它指定:

事务访问方式决定了事务是读/写还是只读。读/写是默认设置。当事务为只读时,不允许使用以下 SQL 命令:INSERT、UPDATE、DELETE 和 COPY FROM,如果它们要写入的表不是临时表;所有 CREATE、ALTER 和 DROP 命令;评论、授予、撤销、截断;和 EXPLAIN ANALYZE 和 EXECUTE 如果它们将执行的命令在列出的命令中。这是只读的高级概念,不会阻止所有写入磁盘。

所以基本上主要的好处是你不会意外修改数据。它类似于 usingCollections.unmodifiableList并且通常会产生更健壮的代码,因此如果您确定给定的事务应该是只读的,请使用该属性。