Avoid getTargetConnection call on transaction-aware Connection close
Closes gh-34484
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2023 the original author or authors.
|
||||
* Copyright 2002-2025 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.
|
||||
@@ -439,7 +439,11 @@ public abstract class DataSourceUtils {
|
||||
public static Connection getTargetConnection(Connection con) {
|
||||
Connection conToUse = con;
|
||||
while (conToUse instanceof ConnectionProxy connectionProxy) {
|
||||
conToUse = connectionProxy.getTargetConnection();
|
||||
Connection targetCon = connectionProxy.getTargetConnection();
|
||||
if (targetCon == conToUse) {
|
||||
break;
|
||||
}
|
||||
conToUse = targetCon;
|
||||
}
|
||||
return conToUse;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2023 the original author or authors.
|
||||
* Copyright 2002-2025 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.
|
||||
@@ -210,13 +210,23 @@ public class TransactionAwareDataSourceProxy extends DelegatingDataSource {
|
||||
sb.append('[').append(this.target).append(']');
|
||||
}
|
||||
else {
|
||||
sb.append(" from DataSource [").append(this.targetDataSource).append(']');
|
||||
sb.append("from DataSource [").append(this.targetDataSource).append(']');
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
case "close" -> {
|
||||
// Handle close method: only close if not within a transaction.
|
||||
DataSourceUtils.doReleaseConnection(this.target, this.targetDataSource);
|
||||
if (this.target != null) {
|
||||
ConnectionHolder conHolder = (ConnectionHolder)
|
||||
TransactionSynchronizationManager.getResource(this.targetDataSource);
|
||||
if (conHolder != null && conHolder.hasConnection() && conHolder.getConnection() == this.target) {
|
||||
// It's the transactional Connection: Don't close it.
|
||||
conHolder.released();
|
||||
}
|
||||
else {
|
||||
DataSourceUtils.doCloseConnection(this.target, this.targetDataSource);
|
||||
}
|
||||
}
|
||||
this.closed = true;
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user