From 2e4eb9fc10f6037f648c76c80a6e08533f7b34e6 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 24 Jul 2013 14:39:15 +0200 Subject: [PATCH] Resource-based PlatformTransactionManager implementations defensively catch Throwable in doBegin in order to reliably close resource in case of OutOfMemoryError Issue: SPR-10755 --- .../jdbc/datasource/DataSourceTransactionManager.java | 2 +- .../jms/connection/JmsTransactionManager.java | 4 ++-- .../orm/hibernate4/HibernateTransactionManager.java | 2 +- .../orm/hibernate3/HibernateTransactionManager.java | 2 +- .../org/springframework/orm/jdo/JdoTransactionManager.java | 2 +- .../org/springframework/orm/jpa/JpaTransactionManager.java | 2 +- .../jca/cci/connection/CciLocalTransactionManager.java | 7 +++---- 7 files changed, 10 insertions(+), 11 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceTransactionManager.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceTransactionManager.java index 0c337bc90e..2e20842237 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceTransactionManager.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceTransactionManager.java @@ -238,7 +238,7 @@ public class DataSourceTransactionManager extends AbstractPlatformTransactionMan } } - catch (Exception ex) { + catch (Throwable ex) { DataSourceUtils.releaseConnection(con, this.dataSource); throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex); } diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager.java b/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager.java index 3587b13582..ebd7818018 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -196,7 +196,7 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager TransactionSynchronizationManager.bindResource( getConnectionFactory(), txObject.getResourceHolder()); } - catch (JMSException ex) { + catch (Throwable ex) { if (con != null) { try { con.close(); diff --git a/spring-orm-hibernate4/src/main/java/org/springframework/orm/hibernate4/HibernateTransactionManager.java b/spring-orm-hibernate4/src/main/java/org/springframework/orm/hibernate4/HibernateTransactionManager.java index e708668129..15e301069c 100644 --- a/spring-orm-hibernate4/src/main/java/org/springframework/orm/hibernate4/HibernateTransactionManager.java +++ b/spring-orm-hibernate4/src/main/java/org/springframework/orm/hibernate4/HibernateTransactionManager.java @@ -500,7 +500,7 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana txObject.getSessionHolder().setSynchronizedWithTransaction(true); } - catch (Exception ex) { + catch (Throwable ex) { if (txObject.isNewSession()) { try { if (session.getTransaction().isActive()) { diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate3/HibernateTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/hibernate3/HibernateTransactionManager.java index 3e30dd8519..07beecad49 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate3/HibernateTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate3/HibernateTransactionManager.java @@ -583,7 +583,7 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana txObject.getSessionHolder().setSynchronizedWithTransaction(true); } - catch (Exception ex) { + catch (Throwable ex) { if (txObject.isNewSession()) { try { if (session.getTransaction().isActive()) { diff --git a/spring-orm/src/main/java/org/springframework/orm/jdo/JdoTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/jdo/JdoTransactionManager.java index 296582f2eb..73fe6d1a53 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jdo/JdoTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/jdo/JdoTransactionManager.java @@ -366,7 +366,7 @@ public class JdoTransactionManager extends AbstractPlatformTransactionManager closePersistenceManagerAfterFailedBegin(txObject); throw ex; } - catch (Exception ex) { + catch (Throwable ex) { closePersistenceManagerAfterFailedBegin(txObject); throw new CannotCreateTransactionException("Could not open JDO PersistenceManager for transaction", ex); } diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java index 1f424977a4..7121f9c2ce 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java @@ -425,7 +425,7 @@ public class JpaTransactionManager extends AbstractPlatformTransactionManager closeEntityManagerAfterFailedBegin(txObject); throw ex; } - catch (Exception ex) { + catch (Throwable ex) { closeEntityManagerAfterFailedBegin(txObject); throw new CannotCreateTransactionException("Could not open JPA EntityManager for transaction", ex); } diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/connection/CciLocalTransactionManager.java b/spring-tx/src/main/java/org/springframework/jca/cci/connection/CciLocalTransactionManager.java index 93404bd98e..08ac3c1aa0 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/connection/CciLocalTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/connection/CciLocalTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,8 +29,8 @@ import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionSystemException; import org.springframework.transaction.support.AbstractPlatformTransactionManager; import org.springframework.transaction.support.DefaultTransactionStatus; -import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.ResourceTransactionManager; +import org.springframework.transaction.support.TransactionSynchronizationManager; /** * {@link org.springframework.transaction.PlatformTransactionManager} implementation @@ -141,7 +141,6 @@ public class CciLocalTransactionManager extends AbstractPlatformTransactionManag @Override protected void doBegin(Object transaction, TransactionDefinition definition) { CciLocalTransactionObject txObject = (CciLocalTransactionObject) transaction; - Connection con = null; try { @@ -169,7 +168,7 @@ public class CciLocalTransactionManager extends AbstractPlatformTransactionManag ConnectionFactoryUtils.releaseConnection(con, getConnectionFactory()); throw new CannotCreateTransactionException("Could not begin local CCI transaction", ex); } - catch (ResourceException ex) { + catch (Throwable ex) { ConnectionFactoryUtils.releaseConnection(con, getConnectionFactory()); throw new TransactionSystemException("Unexpected failure on begin of CCI local transaction", ex); }