2017-02-09 8 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 ] 

Но еще я могу выполнить запрос SQL с пружинными данными в моих CxF маршрутах.

Мое определение DataSource в 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 на каждом компоненте 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) - Закрытое соединение - [Верблюд-1) нить # 59 - jpa: // com.' – teikitel

+0

Таким образом, верблюд поддерживает открытую связь между опросами ? Возможно, вам захочется проконсультироваться с документацией на верблюдах. – Naros

+1

Фактически, если не указано, верблюд создает собственный компонент EntityManagerFactory для JPA. Я, наконец, понял, что не использовал тот, который я объявил в моем весеннем контексте. – teikitel