确保即使数据源出现故障,应用程序也能部署
Make sure that application deploys even if datasource is faulty
是否有一种模式可以确保 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;
我只想部署应用程序,即使它没有完全发挥作用。它将在稍后工作,当数据源 "returns".
希望我正确理解了你的问题。
如果 JEE 服务器 bootstrap 是 EntityManagerFactory 并且没有可用的数据源,但在 persistence.xml 中被引用,那么它将失败,这是可以预料的,因为无法解析依赖关系。
如果创建 EntityManagerFactory 失败,则应用程序无法启动,因为它是 bootstrap 进程的一部分。据我所知,没有办法强制惰性持久化 bootstrap 或在持久化 bootstrap 失败时重试。这将是一种有用的行为,但这种方法是在微服务架构中提出的,并且在当时还没有被常见的 JEE 服务器实现。
如果您希望您的应用程序在没有可用 DataSource 的情况下启动,那么我认为您需要自己 bootstrap EntityManagerFactory,这样您就可以捕获错误并在下次尝试 EntityManager 时尝试它注入。使用这种方法,您将必须自己管理 EntityManagerFactory 和 EntityManager 生命周期以及 CDI 注入的生产者。通过@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
也许您可以提供在 bootstrap 期间获得的错误日志。
是否有一种模式可以确保 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;
我只想部署应用程序,即使它没有完全发挥作用。它将在稍后工作,当数据源 "returns".
希望我正确理解了你的问题。
如果 JEE 服务器 bootstrap 是 EntityManagerFactory 并且没有可用的数据源,但在 persistence.xml 中被引用,那么它将失败,这是可以预料的,因为无法解析依赖关系。
如果创建 EntityManagerFactory 失败,则应用程序无法启动,因为它是 bootstrap 进程的一部分。据我所知,没有办法强制惰性持久化 bootstrap 或在持久化 bootstrap 失败时重试。这将是一种有用的行为,但这种方法是在微服务架构中提出的,并且在当时还没有被常见的 JEE 服务器实现。
如果您希望您的应用程序在没有可用 DataSource 的情况下启动,那么我认为您需要自己 bootstrap EntityManagerFactory,这样您就可以捕获错误并在下次尝试 EntityManager 时尝试它注入。使用这种方法,您将必须自己管理 EntityManagerFactory 和 EntityManager 生命周期以及 CDI 注入的生产者。通过@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
也许您可以提供在 bootstrap 期间获得的错误日志。