From c1dc4e2c75a73633db3d904d24f36583199caf56 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 (cherry picked from commit 2e4eb9f) --- .../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 b0e9811e3a..9f8ed469a9 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 @@ -236,7 +236,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 28a683c8f5..e0d544cbde 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. @@ -191,7 +191,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 5871bb8a87..47fa9b576c 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 @@ -497,7 +497,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 abd06c801a..ff7a4163a7 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 @@ -580,7 +580,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 412a12087a..76ae8146be 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 @@ -365,7 +365,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 259c6e3756..dccc95fec8 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 @@ -423,7 +423,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 aa7d38943d..32eb3ff030 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 @@ -139,7 +139,6 @@ public class CciLocalTransactionManager extends AbstractPlatformTransactionManag @Override protected void doBegin(Object transaction, TransactionDefinition definition) { CciLocalTransactionObject txObject = (CciLocalTransactionObject) transaction; - Connection con = null; try { @@ -167,7 +166,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); }