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
}
还请记住,您应该让未包装的连接保持与您获得它时相同的状态