我有一个应用程序,它使用spring 4.0.1 + JPA + hibenate 4.2.8(spring的JpaTransactionManager,LocalContainerEntityManagerFactoryBean与HibernateJpaDialect和apache的BasicDataSource作为DataSource)进行数据库访问。 在某个时刻,应用程序开始长时间运行的转换(从大表中选择本机查询),必须中断(回滚)。
我尝试了几种设置超时的方法:
1)在LocalContainerEntityManagerFactoryBean的JpaProperties中设置“javax.persistence.query.timeout”
2)JpaTransactionManager的setDefaultTimeout(...)
3)EntityManeger查询的setHint(“javax.persistence.query.timeout”,4000)。
4)Hibernate的QueryImpl的setHint(“org.hibernate.timeout”,4)(hintName“org.hibernate.timeout”)
但这些都没有。 是否可以中断/回滚事务,如果是,我该怎么办?
我的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;
}
答案 0 :(得分:0)
您是否尝试使用简单语句并首先将queryTimeout()设置为数据库服务器?可能是您的版本Oracle不支持提示:cstatement.setQueryTimeout(..),在这种情况下您是否尝试设置Oracle服务器超时设置?
Oracle超时也有一些限制,它不能保证看起来确切的超时: https://access.redhat.com/solutions/17829