【问题标题】:Spring Boot @Transaction(timeout = 1)Spring Boot @Transaction(超时 = 1)
【发布时间】:2018-02-23 06:08:20
【问题描述】:

我正在使用 Spring Boot 1.5.6 中的 spring-boot-starter-data-jpa

例如,当事务超时大于 1 时一切正常 @Transaction(timeout = 2)@Transaction(timeout = 5),或@Transaction(timeout = 10), 但是当我将它设置为@Transaction(timeout = 1) 时,它会在不到一秒的时间内引发异常。这是我的代码的快照:

@Transactional(readOnly=true)
public interface IUserRepository extends CrudRepository<UserEntity,Long>{
     @Transactional(timeout = 1)
     Iterable<UserEntity> findAll();

例外是:

15:18:11.078 [http-nio-9999-exec-2] ERROR [o.a.c.c.C.[.[.[.[dispatcherServlet]:181] - Servlet.service() for servlet [dispatcherServlet] in context with path [/springJPA-LOCAL] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: nested exception is javax.persistence.PersistenceException] with root cause
javax.persistence.PersistenceException: null
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:492)
at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:50)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:329)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:489)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy198.findAll(Unknown Source)
at com.dharam.springJPA.service.impl.UserServiceImpl.doFindAll(UserServiceImpl.java:29)
at com.dharam.springJPA.Controller.SpringJPAController.startFindAll(SpringJPAController.java:39)
at com.dharam.springJPA.Controller.SpringJPAController$$FastClassBySpringCGLIB$$1b008118.invoke(<generated>)
... `

【问题讨论】:

  • 那么,究竟是什么问题。调用可能不会在 1 秒内完成,因此会发生超时,您可能会遇到异常
  • 请正确格式化代码
  • 超时后出现异常如何处理?
  • 我的情况类似,timeout=1 在不到 1 秒的时间内超时,但 timeout&gt;1 永远不会超时!太奇怪了。
  • @CDT 你有没有找到任何线索

标签: spring-boot transactions spring-data-jpa


【解决方案1】:

我发现确定hibernate的事务超时的逻辑有问题。因此,刚刚提出了以下问题。 https://hibernate.atlassian.net/browse/HHH-14062?atlOrigin=eyJpIjoiNTBhZTgzODBmYTFjNDU2MDhhYzM4NjU3ZjFiYzY5NjAiLCJwIjoiaiJ9

我将直接发送 PR 来修复它。不知道什么时候会改,但是如果Hibernate团队确定这个bug是正确的,我想很快就会修复的。

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2021-11-09
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2021-07-10
    • 2019-07-13
    相关资源
    最近更新 更多