我试图从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
答案 0 :(得分:0)
答案:此代码的两个版本之间没有区别。我的问题是由于数据库中的比赛条件造成的。
答案 1 :(得分:0)
有类似的问题。在物化视图创建脚本的末尾添加 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();