是否有一种模式可以确保即使数据源出现故障,也可以部署Java ee应用程序?如果无法访问数据源,我的应用程序将无法启动。无法初始化实体管理器,因此无法将其插入我的ejb中。这会使整个部署失败。
当无法访问数据源时,应用程序确实具有DLQ。
示例:
persistance.xml
<persistence-unit name="dataSourceExample" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/dataSourceExample</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.generate_statistics" value="false"/>
</properties>
</persistence-unit>
wildfly中的数据源配置
<datasource jndi-name="java:jboss/datasources/dataSourceExample" pool-name="dataSourceExamplePool" use-ccm="false">
<connection-url>someurl</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver>com.oracle.ojdbc</driver>
<pool>
<max-pool-size>25</max-pool-size>
</pool>
<security>
<user-name>someusername</user-name>
<password>somepassword</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
<timeout>
<blocking-timeout-millis>5000</blocking-timeout-millis>
</timeout>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</datasource>
在ejb中注入了实体管理器
@PersistenceContext(unitName = "dataSourceExample")
private EntityManager dataSourceExampleEm;
我只是希望部署应用程序,即使它不能完全正常运行。当数据源“返回”时,它将稍后工作。
答案 0 :(得分:3)
希望我能正确理解您的问题。
如果JEE Server引导了EntityManagerFactory,并且没有可用的数据源,但是在persistence.xml中引用了该数据源,则它将失败,这是可以预期的,因为无法解决依赖关系。
如果EntityManagerFactory的创建失败,则该应用程序无法启动,因为它是引导过程的一部分。据我所知,如果持久性引导失败,则无法强制执行惰性持久性引导或重试。这将是一个有用的行为,但是这种方法是微服务体系结构提出的,并且在当时还没有被普通的JEE服务器实现。
如果您想在没有可用数据源的情况下启动应用程序,那么我认为您需要自己引导EntityManagerFactory,这样您就可以捕获错误,并在下次尝试注入EntityManager时进行尝试。使用这种方法,您将必须自己以及CDI注入的生产者自己管理EntityManagerFactory和EntityManager生命周期。然后,无法通过@PersistenceUnit进行注入。
Getting a reference to EntityManager in Java EE applications using CDI
https://www.sitepoint.com/cdi-weld-inject-jpa-hibernate-entity-managers/
https://deltaspike.apache.org/documentation/jpa.html
也许您提供了在引导过程中获得的错误日志。