2

我使用 eclipselink 作为 JPA 的实现,我想知道是否可以检查我的 EntityManagerFactory 是否“活着”

例如,如果连接参数无效,当我创建 EMF 时,在开始事务之前我没有任何异常

谢谢

4

3 回答 3

2

EclipseLink 默认延迟部署以改善服务器启动时间。

您可以将部署配置为在服务器开始使用时发生,

“eclipselink.deploy-on-startup”=“真”

在您的 persistence.xml 中。

于 2012-04-11T13:37:30.090 回答
2

使用 entityManagerFactory 您只能获取 EntityManager 并向数据库发送检查查询,但在这种情况下,我认为最好的解决方案是使用验证器配置连接池。

这样,从池中创建或检索的每个连接都通过 JDBC API 或简单查询进行验证。例如,在数据源配置中的 JBoss 中,您可以添加以下行:

<!-- sql to call when connection is created    -->
<new-connection-sql>some arbitrary sql</new-connection-sql>

<!-- sql to call on an existing pooled connection when it is obtained from pool     -->
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>

或(对于 Postgres,但每个 DBMS 都有示例)

<validation>
  <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker>
  <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter>
</validation>
于 2012-04-11T08:29:12.927 回答
0

目前我使用这段代码:

try {
  emf = Persistence.createEntityManagerFactory(pu, properties);
} catch (Exception e) {
  throw new DaoException("cannot open entity manager factory", e);
}

EntityManager em = null;
try {
  em = emf.createEntityManager();
} catch (Exception e) {
  throw new DaoException("cannot open entity manager", e);
} finally {
  if (null!=em && em.isOpen()) {
    em.close();
  }
}

我会尝试你的建议谢谢

于 2012-04-12T19:01:18.640 回答