当前位置: 首页 > 知识库问答 >
问题:

SpringHibernate事务超时

暨弘毅
2023-03-14

我有一个应用程序,它使用spring 4 . 0 . 1 JPA hiba Nate 4 . 2 . 8(spring的JpaTransactionManager,localcontainereentitymanagerfactorybean,带有HibernateJpaDialect和apache的BasicDataSource作为数据源)进行数据库访问。在某个时刻,应用程序开始一个长时间运行的事务(从一个大表中选择本地查询),这个事务必须被中断(回滚)。

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

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

2)JpaTransactionManager的setDefaultTimeout(…)

EntityManeger的查询的set hint(" javax . persistence . Query . time out ",4000)。

4) hibernate的QueryImpl(hintName“org.hibernate.timeout”)的setHint(“org.habernate.timeout”,4)

但这些都行不通。是否可以中断/回滚事务,如果是,我该如何执行此操作?

我的想法:

@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个答案

海保臣
2023-03-14

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

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

 类似资料:
  • 我需要在事务成功或回滚后调用一些方法。我使用as 应用程序使用一些外部web服务,当内部事务回滚时,这些服务需要“清理”。有没有一种方法可以在不使用声明性事务管理的情况下实现这一点。

  • 众所周知,不在Spring-Hibernate应用程序中使用@Transactional注释会产生Hibernate异常: 线程"main"org.hibernate.HibernateException中的异常:无法获取当前线程的事务同步会话 我想知道“事务同步会话”是什么意思?

  • 我使用的是Spring Boot 1.4.2中的spring-boot-starter-data-jpa。 一切都很好(@Entity classes discovery、datasource自动配置、transaction自动配置、EntityManager自动配置)。

  • 问题内容: 我正在运行以下MySQL语句: 我没有使用交易,所以为什么会出现此错误?我什至尝试重新启动MySQL服务器,但没有帮助。 该表有406,733行。 问题答案: 您正在使用交易;autocommit不会禁用事务,它只是使它们在语句末尾自动提交。 发生的事情是,某个其他线程在某个记录上保持记录锁定(您正在更新表中的每个记录!)的时间太长,导致您的线程超时。 您可以通过发出 事件发生后(在编

  • 在Spring Hibernate JTA项目中,我试图让异常处理工作。对于以下代码: 我试图捕捉底层hibernate/jdbc/db异常(例如,当依赖实体仍然存在时,删除将失败,并出现org . spring framework . ORM . hibernate 3 . hibernate JDBC exception)并执行一些操作。然而,catch代码永远不会到达。 但是如果我从我的方法