camel中的JPA组件无法自动重新连接到数据库

时间:2017-02-09 18:08:44

标签: java spring hibernate jpa apache-camel

在我的应用程序运行时重启数据库时, JPA组件无法自动重新连接。

2017-02-09 17:45:08,400 ERROR o.h.e.j.spi.SqlExceptionHelper(131) - Connection closed. - [Camel (camel-1) thread #99 - jpa://com.toto.Toto  ]

但仍然我能够在我的CXF路由中使用spring-data执行SQL请求。

context.xml中的我的数据源定义:

<!-- JDBC connection -->
    <Resource name="jdbc/oracle"
            auth="Container"
            type="javax.sql.DataSource"
            username="toto"
            password="toto"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@toto:1568:SID"
            maxTotal="100"
            maxIdle="10"
            testOnBorrow="true"
            validationQuery="select 1 from dual"/>

以下是我的JPA组件的样子:

    @Component
public class TotoPollerRoute extends RouteBuilder {

  private final String uri;

  private static final String POLLING_REQUEST = "select tt from Toto tt where tt.key = 1";

  public TotoPollerRoute() {
    super();
    final StringBuilder uriBuilder = new StringBuilder();
    uriBuilder.append("jpa://");
    uriBuilder.append(TotoPollerRoute.class.getName());
    uriBuilder.append("?");
    uriBuilder.append("consumeDelete=false");
    uriBuilder.append("&consumeLockEntity=true");
    uriBuilder.append("&consumer.SkipLockedEntity=true");
    uriBuilder.append("&maximumResults=10");
    uriBuilder.append("&consumer.query=");
    uriBuilder.append(POLLING_REQUEST);
    this.uri = uriBuilder.toString();
  }

  @Override
  public void configure() {
    // @formatter:off
    from(uri)
        .to("TotoMainRoute");
    // @formatter:on
  }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

经过一些深度调试后,我终于发现我的JPA组件并没有使用在Spring上下文中声明的EntityManagerFactory。

解决这个问题的两种方法:

  1. 修改每个JPA组件上的JPA uri并添加sharedEntityManager选项:

    Windows 10 OS
  2. Spring中的Instanciate JPA组件:

    private final String uri = "jpa://TotoPollerRoute?consumeDelete=false"
        + "&consumeLockEntity=true"
        + "&consumer.SkipLockedEntity=true"
        + "&maximumResults=10"
        + "&sharedEntityManager=true"
        + "&joinTransaction=false"
        + "&consumer.query=select tt from Toto tt where tt.key = 1";
    

答案 1 :(得分:0)

尝试指定以下属性

  • validationInternal="30000"
  • testWhileIdle="true"
  • testOnReturn="false"

除了您声明的以下内容之外:

  • testOnBorrow="true"
  • validationQuery="select 1 from dual"