2017-02-09 50 views
1

当我的应用程序正在运行时重新启动数据库时,JPA组件无法自动重新连接。骆驼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路线执行与弹簧数据的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

后一些深层次的调试,我终于想通了,我的JPA组件没有使用的EntityManagerFactory的Spring上下文声明。

两种方式解决:

  1. 修改JPA URI每个JPA组件,并添加sharedEntityManager选项:

    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"; 
    
  2. 实例化JPA组件在Spring:

    @Bean 
    public JpaComponent jpa() { 
        final JpaComponent jpa = new JpaComponent(); 
        jpa.setSharedEntityManager(true); 
        jpa.setJoinTransaction(false); 
        return jpa; 
    } 
    
0

尝试指定下列属性

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

除了其下面你声明:

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

还不够,我哈哈有相同的行为。 虽然重新启动我的数据库,我得到以下错误的顺序: '2017-02-10 10:58:00,366错误ohejspi.SqlExceptionHelper(131) - ORA-01033:正在进行ORACLE初始化或关机# '2017 -02-10 10:58:05,615错误ohejspi.SqlExceptionHelper(131) - 没有更多数据要从套接字读取 - [骆驼(骆驼-1)线程#10 - jpa:// com.' '2017-02 -10 10:58:30,339错误ohejspi.SqlExceptionHelper(131) - 关闭连接 - [Camel(camel-1)thread#59 - jpa:// com.' – teikitel

+0

因此,骆驼正在保持连接在民意调查之间打开?然后您可能需要查阅骆驼文档。 – Naros

+1

实际上,如果没有指定骆驼instanciate它自己的EntityManagerFactory JPA组件。我终于明白它并没有使用我在我的春天环境中声明的那个。 – teikitel