Как очистить таблицы базы данных в приложении Spring Boot? - PullRequest
2 голосов
/ 07 апреля 2019

Моя текущая попытка (согласно этому ответу ) выглядит следующим образом:

@Service
class VacuumDatabaseService(
        private val entityManager: EntityManager
) {
    fun vacuumAllTables() {
        val session = entityManager.unwrap(org.hibernate.Session::class.java)
        val sessionImpl = session as org.hibernate.internal.SessionImpl
        val connection = sessionImpl.connection()
        connection.prepareStatement("VACUUM FULL").execute()
    }
}

Но выдает:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No transactional EntityManager available

Аннотирование функции с помощью @Transactional приводит к:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException

Caused by: org.postgresql.util.PSQLException: ERROR: VACUUM cannot run inside a transaction block

Следующее работает, но чувствует себя опасно неправильно:

    @Transactional
    fun vacuumAllTables() {
        val session = entityManager.unwrap(org.hibernate.Session::class.java)
        val sessionImpl = session as org.hibernate.internal.SessionImpl
        val connection = sessionImpl.connection()
        connection.prepareStatement("END TRANSACTION; VACUUM FULL;").execute()
    }

Какой правильный путь?

1 Ответ

5 голосов
/ 07 апреля 2019

Вам просто нужно ввести DataSource, извлечь из него соединение, выполнить свою работу и закрыть соединение.

@Service
class VacuumDatabaseService(
        private val dataSource: DataSource
) {

    fun vacuumAllTables() {
        dataSource.connection.use {
            it.prepareStatement("VACUUM FULL").execute()
        }
    }
}

Обратите внимание на использование use, которое закрывает соединение после выполнения блока.

...