2015-07-24 4 views
0

У меня есть приложение, которое использует Spring 4.0.1 + JPA + hibenate 4.2.8 (Spring's JpaTransactionManager, LocalContainerEntityManagerFactoryBean с HibernateJpaDialect и базовый источник данных Apache как DataSource) для доступа к БД. В определенный момент приложение начинает длительную трансацию (собственный запрос выбирается из большой таблицы), который должен быть прерван (откат).Весна + спящий тайм-аут транзакции

Я попробовал несколько подходов, чтобы установить тайм-аут:

1) Установить "javax.persistence.query.timeout" в JpaProperties из LocalContainerEntityManagerFactoryBean

2) setDefaultTimeout (...) от JpaTransactionManager

3) setHint ("javax.persistence.query.timeout", 4000) запроса EntityManeger.

4) setHint ("org.hibernate.timeout", 4) из QueryImpl (hintName "org.hibernate.timeout" в Hibernate)

Но никто из этих работ. Возможно ли прервать/отменить транзакцию и как я могу это сделать, если это так?

Моего confs:

@Bean(name = "entityManagerFactory") 
public EntityManagerFactory entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setDataSource(dataSource()); 
    em.setJpaDialect(new HibernateJpaDialect()); 
    em.setJpaVendorAdapter(jpaVendorAdapter()); 
    em.setJpaProperties(getJpaProperties()); 
    em.setPersistenceUnitName("persUnit"); 

    em.setMappingResources("/META-INF/app.hbm.xml"); 
    em.afterPropertiesSet(); 
    return em.getObject(); 
} 

public Properties getJpaProperties() { 
    Properties properties = new Properties(); 
     properties.put("hibernate.temp.use_jdbc_metadata_defaults", "false"); 
    properties.put("hibernate.cache.provider_configuration", 
"/ehcache.xml"); 
    properties.put("hibernate.cache.use_second_level_cache", "true"); 
    properties.put("hibernate.cache.use_query_cache", "true"); 
    properties.put("hibernate.generate_statistics", "true"); 
    properties.put("hibernate.jdbc.use_get_generated_keys", "true"); 
    properties.put("hibernate.jdbc.batch_size", "100"); 
    properties.put("hibernate.jdbc.fetch_size", "100"); 
    properties.put("hibernate.jdbc.batch_versioned_data", "true"); 
    properties.put("hibernate.cache.use_structured_entries", "true"); 
    properties.put("hibernate.cache.region.factory_class",  
    "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"); 

    return properties; 
} 

@Bean(name = "jpaVendorAdapter") 
public JpaVendorAdapter jpaVendorAdapter() { 
    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    jpaVendorAdapter.setDatabase(Database.ORACLE); 
    jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect"); 
    return jpaVendorAdapter; 
} 

@Bean 
public DataSource dataSource() { 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setUrl(getUrl()); 
    dataSource.setUsername(user); 
    dataSource.setPassword(password); 

    dataSource.setAccessToUnderlyingConnectionAllowed(true); 

    dataSource.setDriverClassName(...); 

    dataSource.setMaxWait(5000); 
    dataSource.setMaxActive(30); 
    dataSource.setMaxIdle(3); 

    return dataSource; 
} 
+1

Где войти ошибку? –

+1

Вы можете использовать свойство timeout в аннотации @Transactional; посмотрите здесь http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html. Надеюсь, это поможет. –

ответ

0

Пытались ли вы с простым утверждением и установив QueryTimeout() первой к серверу базы данных? Может быть, ваша версия Oracle не поддерживает подсказку: cstatement.setQueryTimeout (..), и в этом случае вы попытались установить настройку тайм-аута сервера Oracle?

Есть также несколько ограничений на время ожидания Oracle, это не гарантирует точное время ожидания, как это кажется: https://access.redhat.com/solutions/17829

+0

Чтобы избежать этой ошибки в спящем режиме, вам нужно добавить еще 1 секунду к вашему таймауту, т. Е. Если вам нужен тайм-аут 2 с, установите тайм-аут = 3: https://hibernate.atlassian.net/browse/HHH-9482 – kisna

Смежные вопросы