EntityManagerFactory и схема БД (поставщик сохраняемости: Hibernate 5.3.7) инициализируется дважды в Weblogic 12.2.1.3

Я использую Гибернация 5.3.7.Финал в качестве поставщика постоянства на Weblogic 12.2.1.3.

Моя проблема в том, что когда я развертываю свое приложение, которое содержит блок сохранения состояния, фабрика диспетчера сущностей дважды инициализируется Weblogic.

Сначала в приложении подготовить этап, а затем снова в приложении активировать фазу. В результате вся моя схема БД инициализируется дважды (hibernate.hbm2ddl.auto = Создайте).

Я прикрепил соответствующие части цепочек вызовов методов обеих фаз.

Первый (этап подготовки):

HibernatePersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map) line: 141    
BasePersistenceUnitInfo.initializeEntityManagerFactory(boolean, BeanManager) line: 614  
BasePersistenceUnitInfo.init() line: 202    
BaseJPAIntegrationProvider.createPersistenceUnitInfo(PersistenceUnitBean, Object, GenericClassLoader, String, URL, URL, String, ApplicationContextInternal) line: 54    
ModulePersistenceUnitRegistry(AbstractPersistenceUnitRegistry).storeDescriptors(Map, Map) line: 422 
ModulePersistenceUnitRegistry(AbstractPersistenceUnitRegistry).loadPersistenceDescriptors(boolean) line: 128    
ModulePersistenceUnitRegistry.<init>(GenericClassLoader, ApplicationContextInternal, Module, boolean) line: 56  
WebAppInternalModuleExtension$PersistenceExtension.setupPersistenceUnitRegistry() line: 197 
WebAppInternalModuleExtension$PersistenceExtension.access$300(WebAppInternalModuleExtension$PersistenceExtension) line: 118 
WebAppInternalModuleExtension.prePrepare() line: 56 
ExtensibleModuleWrapper$PrepareStateChange.next(ExtensibleModuleWrapper$DrivenObject) line: 293 
ExtensibleModuleWrapper$PrepareStateChange.next(Object) line: 285   
StateMachineDriver<StateMachine>.nextState(StateChange<StateMachine>, StateMachine[]) line: 45  
ExtensibleModuleWrapper.prepare() line: 109

Второй (фаза активации):

HibernatePersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo, Map) line: 141    
BasePersistenceUnitInfo.initializeEntityManagerFactory(boolean, BeanManager) line: 614  
BasePersistenceUnitInfo.reInitEntityManagerFactoryPerhaps() line: 785   
BasePersistenceUnitInfo.activate(Context) line: 750 
WebAppInternalModuleExtension$PersistenceExtension.activatePersistenceUnit() line: 160  
WebAppInternalModuleExtension$PersistenceExtension.access$700(WebAppInternalModuleExtension$PersistenceExtension) line: 118 
WebAppInternalModuleExtension.postActivate() line: 81   
ExtensibleModuleWrapper$ActivateStateChange.next(ExtensibleModuleWrapper$DrivenObject) line: 321    
ExtensibleModuleWrapper$ActivateStateChange.next(Object) line: 313  
StateMachineDriver<StateMachine>.nextState(StateChange<StateMachine>, StateMachine[]) line: 45  
ExtensibleModuleWrapper.activate() line: 121

Я думаю, что Weblogic принимает решение в методе

BasePersistenceUnitInfo.reInitEntityManagerFactoryPerhaps()

следует ли повторно инициализировать фабрику менеджеров сущностей после активации единицы сохранения состояния.

Я много искал, но пока не нашел никаких настроек, чтобы как-то точно настроить это поведение при начальной загрузке.

Кто-нибудь знает, как избежать инициализации дублирующейся схемы БД?

(У меня довольно большая схема и import.sql, поэтому процесс занимает много времени.)

Вот мой файл persistence.xml для справки:

<?xml version = "1.0" encoding = "UTF-8"?>
<persistence version = "2.0"
    xmlns = "http://java.sun.com/xml/ns/persistence" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name = "abPersistenceUnit" transaction-type = "JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/abDS</jta-data-source>

        <jar-file>ab.jar</jar-file>
        <jar-file>lib/cd.jar</jar-file>

        <properties>
            <property name = "hibernate.dialect" value = "org.hibernate.dialect.Oracle10gDialect" />
            <property name = "hibernate.hbm2ddl.auto" value = "${hibernate.hbm2ddl.auto}" />
            <property name = "hibernate.show_sql" value = "false" />
            <property name = "hibernate.format_sql" value = "true" />
            <property name = "hibernate.default_schema" value = "${hibernate.default_schema}" />
            <property name = "hibernate.cache.second_level_cache" value = "false" />
            <property name = "hibernate.jdbc.batch_size" value = "50" />
            <property name = "hibernate.order_inserts" value = "true" />
            <property name = "hibernate.order_updates" value = "true" />
            <property name = "hibernate.jdbc.batch_versioned_data" value = "true" />
            <property name = "hibernate.search.autoregister_listeners" value = "false" />
            <property name = "hibernate.current_session_context_class" value = "jta" />
            <property name = "hibernate.transaction.coordinator_class" value = "jta" />
            <property name = "hibernate.transaction.jta.platform" value = "org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform" />
            <property name = "hibernate.id.new_generator_mappings" value = "true" />
        </properties>
    </persistence-unit>
</persistence>

Я очень ценю любые мысли или комментарии!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
119
1

Ответы 1

Столкнулся с точно такой же проблемой. Единственная рекомендация, которую я могу придумать, - не использовать CDI в модуле, поскольку код, похоже, предполагает, что он будет повторно инициализировать блок сохранения состояния только в том случае, если для модуля включен CDI.

s

 public void reInitEntityManagerFactoryPerhaps() throws EnvironmentException {
        BeanManager bm = null;
        if (this.appCtx != null) {
            bm = this.getBeanManager(this.getCDIArchiveID(this.persistenceArchiveId));
        }

        if (this.isDataSourceReInitializationNeeded()) {
            this.close();
            this.initializeEntityManagerFactory(true, bm);
        } else if (!this.isKodoPersistenceUnit() && bm != null) {
            this.close();
            this.initializeEntityManagerFactory(true, bm);
        }

    }

Я установил точку останова в wlfullclient и произвел удаленную отладку. Этот код взят из EJBModule внутри weblogic.

Спасибо за ваш ответ! Не могли бы вы сказать мне, откуда вам удалось получить исходные файлы, связанные с Weblogic (BasePersistenceUnitInfo.java и т. д.)? Я бы тоже их проверил.

Gergely Tóth 09.12.2019 11:20

Другие вопросы по теме