Java中使用execute()和executeUpdate()刷新PostgreSQL物化视图的区别

4
我尝试从我的Java程序中刷新PostgreSQL中的物化视图:
conn = AbstractClientDao.getJdbcConnection();
pst = conn.prepareStatement("REFRESH MATERIALIZED VIEW mv_my_materialized_view;");
pst.execute();
conn.close();

根据文档,execute()方法可用于任何类型的SQL语句:
执行此PreparedStatement对象中的SQL语句,它可以是任何类型的SQL语句
注意: 在程序的这一部分,我不需要了解结果,因此返回值不重要。
该代码在数据库中没有实际操作,物化视图未更新,但在java程序中未抛出错误/异常。 经过一番搜索,我使用相同的代码,但使用executeUpdate()
conn = AbstractClientDao.getJdbcConnection();
pst = conn.prepareStatement("REFRESH MATERIALIZED VIEW mv_my_materialized_view;");
pst.executeUpdate();
conn.close();

从文档中可以看到,executeUpdate() 方法适用于任何类型的 SQL 语句:

在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(DML)语句,例如 INSERT、UPDATE 或 DELETE;或者是一个不返回结果的 SQL 语句,例如 DDL 语句。

此代码有效并正确更新了视图。

我是否漏掉了什么,或者文档没有清楚地说明 execute() 和 executeUpdate() 之间的区别?

注意:Java8,Postgresql 9.6,驱动程序 org.postgresql,版本 9.3-1101-jdbc41。

2个回答

1

我遇到了类似的问题。在创建物化视图的脚本末尾添加 WITH DATA 是我的问题所在。

PostgreSQL

CREATE MATERIALIZED VIEW my_mat_view
AS
SELECT * FROM my_table
WITH DATA
;

JAVA
entityManager
.createNativeQuery("REFRESH MATERIALIZED VIEW my_mat_view;")
.executeUpdate();

0

答案:这段代码的两个版本之间没有区别。我的问题是由于数据库中的竞态条件引起的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接