使用 JPA 执行 VACUUM FULL

Perform VACUUM FULL with JPA

我正在使用 PostgreSQL 数据库,我想开始 VACUUM FULL 使用 JPA EntityManager。

版本 1

public void doVacuum(){
  entityManager.createNativeQuery("VACUUM FULL").executeUpdate()
}

抛出 TransactionRequiredException

版本 2

@Transactional
public void doVacuum(){
  entityManager.createNativeQuery("VACUUM FULL").executeUpdate()
}

抛出 PersistenceException "VACUUM cannot run inside a transaction block"

版本 3

public void doVacuum(){
  entityManager.createNativeQuery("VACUUM FULL").getResultList()
}

执行了 vacuum 但之后我得到 PersistenceException "No results"

启动此 sql 命令的正确方法是什么?

正如 Alay Hay 提到的,使用底层连接将起作用:

public void doVacuum(){
  org.hibernate.Session session = entityManager.unwrap(org.hibernate.Session);
  org.hibernate.internal.SessionImpl sessionImpl = (SessionImpl) session;  // required because Session doesn't provide connection()
  java.sql.Connection connection = sessionImpl.connection();
  connection.prepareStatement("VACUUM FULL").execute();
}

这是一个不需要转换为 Hibernate Session 内部实现的解决方案。请记住,事务块中的 VACUUM 不能是 运行,这就是为什么你需要将 autoCommit 设置为 true

Session session = entityManager.unwrap(Session.class);
session.doWork(new Work() {
  @Override
  public void execute(Connection connection) throws SQLException {
    connection.setAutoCommit(true);
    connection.prepareStatement("VACUUM FULL").execute();
    connection.setAutoCommit(false);
  }
});