hibernate - 强制 Spring/JPA/Hibernate/JDBC 重试失败的 beginTransaction?

标签 hibernate spring jpa jdbc c3p0

有时,由于在尝试访问 MySQL 时出现简单的 SocketException,数据库事务无法开始。在当前代码库中,所有 SQL 或 JPQL 代码都驻留在带有 @Transactional 注释 (org.springframework.transaction.annotation) 的类中。每次调用带注释的类的方法时,都会为我创建一个事务。这使得编写可在所有数据库调用中重复使用的代码变得困难。

一个解决方案是将数据库代码放在一个循环中:它将重试事务几次。这行得通,但我不想让我的代码充满循环(每个 db 调用一个循环)。

他们是否可以让以下任一框架自动重试失败的 beginTransaction?:Spring、JPA、Hibernate、c3p0、MySQL JDBC 驱动程序

作为引用,这里是一段日志:

java.net.SocketException
MESSAGE: Connection reset

STACKTRACE:
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
        at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
        at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1910)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
        at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5273)
        at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
        at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38)
        at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:52)
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:330)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:374)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)

附言。我讨厌据称可以解决所有问题的自动化框架。这不是我在这个项目中做出的决定。

最佳答案

如果您不想在代码中加入重试循环,也许您可​​以使用 AOP 来实现重试功能。有一个 example Spring 文档中的此类建议。

关于hibernate - 强制 Spring/JPA/Hibernate/JDBC 重试失败的 beginTransaction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6344649/

相关文章:

java - hibernate中discriminator tag位置下移会出现异常

spring - 是否可以在 Spring 中为 bean 类命名别名?

mysql - 关于spring/jpa/hibernate中乐观锁的简单设计问题

java - JPA关系 JPAContainer与ComboBox?

java - jpa引用外部表而不是JoinColumn中的外部列

使用连接表 hibernate 一对多,并 hibernate 注释

java - 为什么 DATE 函数不能与 Hibernate 中的 count unique 一起使用?

java - 使用 JPA merge() 时出现 OptimisticLockException

java - Spring Controller 保持旧值

java - EJB+EclipseLink 或 Spring+Hibernate