确保即使数据源出现故障,应用程序也能部署

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 期间获得的错误日志。