使用 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);
}
});
我正在使用 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);
}
});