Java 是否重新使用未包装的连接?

Java 是否重新使用未包装的连接?,java,jdbc,spring-jdbc,Java,Jdbc,Spring Jdbc,我有一个弹簧组件,如下所示: @Component class FooComponent { @Autowired private DataSource dataSource; public void execute() { try (SQLServerConnection connection = dataSource.getConnection().unwrap(SQLServerConnection.class)) { // so

我有一个弹簧组件,如下所示:

@Component
class FooComponent {

    @Autowired
    private DataSource dataSource;

    public void execute() {
        try (SQLServerConnection connection = dataSource.getConnection().unwrap(SQLServerConnection.class)) {
        // some logic here with connection
        }
    }   
}
我必须打开连接,因为我正在使用来自Microsoft JDBC驱动程序的一些API(如果我只是传递
dataSource.getConnection()
,它会抛出exeption)

所以我的问题是: 我在
execute
方法中正确获取了连接?这段代码会导致“连接泄漏”吗

我这样问是因为我在日志中看到一个错误,比如:
无法获得JDBC连接;嵌套的异常是org.apache.tomcat.jdbc.pool.pooldepustedexception
。(我不是问如何解决这个错误或它意味着什么)

所以我的问题是:我在execute方法中正确地获得了连接

否,池返回的是连接代理,而不是真实的连接代理(请参阅)。 代理的
close
方法被“覆盖”以返回到池的连接:

if (compare(CLOSE_VAL,method)) {
    if (connection==null) return null; //noop for already closed.
        PooledConnection poolc = this.connection;
        this.connection = null;
        pool.returnConnection(poolc);
        return null;
    } 
}
但当你这么做的时候

try (SQLServerConnection connection = dataSource.getConnection().unwrap(SQLServerConnection.class)) 
close
方法在实际连接上调用,而不是在代理上调用。连接不会返回到池,最终池会抛出
pooldepustedexception

以下是如何修复它:

try (Connection connection = dataSource.getConnection()) { // proxy is returned to the pool
    SQLServerConnection c = connection.unwrap(SQLServerConnection.class));
    // Work with SQLServerConnection 
}
还请记住,您应该让未包装的连接保持与您获得它时相同的状态