2017-10-27 17 views
1

私はPostgreSQL DBを使用していますので、JPA EntityManagerを使用してVACUUM FULLを開始します。JPAでVACUUM FULLを実行

バージョン1

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

はTransactionRequiredException

バージョン2

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

"VACUUMは、トランザクションブロック内で実行することはできません" PersistenceExceptionをスローを投げます

バージョン3

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

真空が行われるが、その後、私はPersistenceExceptionは「結果なし」を取得しない

このSQLコマンドを起動するための正しい方法は何ですか?

+0

これは本当にJPAの範囲で行われるべきものですか?私はそれが悪いことではありませんが、それはいくつかのDBAの事ではないのですか? JPAを使用してDBAツールを開発しようとしていますか?しかし、まだ興味深い面。 – pirho

+1

基本となる接続を取得し、raw JDBCにフォールバックしますか?接続を取得するメカニズムについては、こちらを参照してください。https://stackoverflow.com/questions/3493495/getting-database-connection-in-pure-jpa-setup –

答えて

0

Alayヘイは、基になる接続が動作します使用して、前述のように:

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() 
} 
+0

とエンティティマネージャの取得方法は? – pixel

+0

これは、データベース接続の処理方法や使用しているフレームワークによって異なります。私は現在、Springを使用しているため、注釈付きのフィールド「@PersistenceContext private EntityManager enitityManger」が注入されるのに十分です。 – Marcel

関連する問題