【问题标题】:Java execute() vs executeUpdate() to refresh materialized view in PostgresqlJava execute() vs executeUpdate() 刷新 Postgresql 中的物化视图
【发布时间】:2020-06-24 16:44:26
【问题描述】:

我试图从我的 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

【问题讨论】:

    标签: java postgresql jdbc


    【解决方案1】:

    答案:此代码的 2 个版本之间没有区别。我的问题是由于我的数据库中的竞争条件造成的。

    【讨论】:

      【解决方案2】:

      有类似的问题。在物化视图创建脚本的末尾添加 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();
      

      【讨论】:

        猜你喜欢
        • 2022-08-09
        • 1970-01-01
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 1970-01-01
        • 2015-05-27
        • 2021-10-14
        相关资源
        最近更新 更多