【问题标题】:Spring + hibernate transaction timeoutSpring +休眠事务超时
【发布时间】:2015-10-15 07:06:54
【问题描述】:

我有一个应用程序,它使用 spring 4.0.1 + JPA + hibenate 4.2.8(spring 的 JpaTransactionManager、LocalContainerEntityManagerFactoryBean 和 HibernateJpaDialect 和 apache 的 BasicDataSource 作为数据源)进行数据库访问。 在某个时刻,应用程序开始了一个长时间运行的事务(从大表中选择本地查询),该事务必须被中断(回滚)。

我尝试了几种设置超时的方法:

1) 在 LocalContainerEntityManagerFactoryBean 的 JpaProperties 中设置“javax.persistence.query.timeout”

2) JpaTransactionManager 的 setDefaultTimeout(...)

3) EntityManeger 的 Query 的 setHint("javax.persistence.query.timeout", 4000)。

4) Hibernate 的 QueryImpl 的 setHint("org.hibernate.timeout", 4) (hintName "org.hibernate.timeout")

但是这些都不起作用。 是否可以中断/回滚事务,如果可以,我该怎么做?

我的自信:

@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;
}

【问题讨论】:

  • 错误日志在哪里?
  • 可以在@Transactional注解中使用timeout属性;看看这里docs.spring.io/spring/docs/current/javadoc-api/org/…。我希望这可以帮助
  • 请问您是如何为 jpa 查询设置超时的?你找到解决方案了吗?因为我有同样的问题,没有什么对我有用

标签: spring hibernate jpa


【解决方案1】:

您是否尝试过使用简单的语句并首先将 queryTimeout() 设置到您的数据库服务器?可能是你的版本Oracle不支持提示:cstatement.setQueryTimeout(..),在这种情况下你有没有尝试设置Oracle服务器超时设置?

Oracle 超时也有一些限制,它并不能保证确切的超时时间: https://access.redhat.com/solutions/17829

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2010-10-12
  • 2011-11-16
  • 2016-03-19
  • 2014-06-09
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多