У меня есть приложение, которое использует 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;
}
Где войти ошибку? –
Вы можете использовать свойство timeout в аннотации @Transactional; посмотрите здесь http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html. Надеюсь, это поможет. –