DataSourceUtils lets timeout exceptions through even for setReadOnly calls (revised; SPR-7226)

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@3364 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
Juergen Hoeller 2010-05-25 13:57:56 +00:00
parent db32d52375
commit 626d75ff61
2 changed files with 23 additions and 10 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2009 the original author or authors. * Copyright 2002-2010 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,7 +18,6 @@ package org.springframework.jdbc.datasource;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
@ -236,7 +235,7 @@ public class DataSourceTransactionManager extends AbstractPlatformTransactionMan
} }
} }
catch (SQLException ex) { catch (Exception ex) {
DataSourceUtils.releaseConnection(con, this.dataSource); DataSourceUtils.releaseConnection(con, this.dataSource);
throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex); throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex);
} }

View File

@ -154,14 +154,28 @@ public abstract class DataSourceUtils {
} }
con.setReadOnly(true); con.setReadOnly(true);
} }
catch (Throwable ex) { catch (SQLException ex) {
if (ex instanceof SQLException && (ex.getClass().getSimpleName().contains("Timeout") || Throwable exToCheck = ex;
(ex.getCause() != null && ex.getCause().getClass().getSimpleName().contains("Timeout")))) { while (exToCheck != null) {
// Assume it's a connection timeout that would otherwise get lost: e.g. from C3P0. if (exToCheck.getClass().getSimpleName().contains("Timeout")) {
throw (SQLException) ex; // Assume it's a connection timeout that would otherwise get lost: e.g. from JDBC 4.0
throw ex;
}
exToCheck = exToCheck.getCause();
} }
// "read-only not supported" SQLException or UnsupportedOperationException // "read-only not supported" SQLException -> ignore, it's just a hint anyway
// -> ignore, it's just a hint anyway. logger.debug("Could not set JDBC Connection read-only", ex);
}
catch (RuntimeException ex) {
Throwable exToCheck = ex;
while (exToCheck != null) {
if (exToCheck.getClass().getSimpleName().contains("Timeout")) {
// Assume it's a connection timeout that would otherwise get lost: e.g. from Hibernate
throw ex;
}
exToCheck = exToCheck.getCause();
}
// "read-only not supported" UnsupportedOperationException -> ignore, it's just a hint anyway
logger.debug("Could not set JDBC Connection read-only", ex); logger.debug("Could not set JDBC Connection read-only", ex);
} }
} }