为什么我的 Java JDBC 到 Firebird 数据库连接不会断开连接?



我正在使用以下代码连接到火鸟数据库

public static Connection dbStatic;    
...
public void getConnection(){
FBWrappingDataSource DataSource = new FBWrappingDataSource();
DataSource.setDatabase("localhost/3050:C:/MyDatabase.FDB");
DataSource.setDescription("TNS Development Database");
DataSource.setType("TYPE4");
DataSource.setEncoding("ISO8859_1");
DataSource.setLoginTimeout(10);
try {
dbStatic = DataSource.getConnection("UserName", "Password");
} catch (SQLException e) {
e.printStackTrace();
} 
}

。以及要断开连接的以下内容:

...
dbStatic.close();
...

我正在使用在Windows 7-32位机器上运行的Firebird 2.1,Java版本1.7,Jaybird版本2.2.8,Tomcat版本7.xx运行在Win7-32位上,浏览器是Chrome版本或其他运行Win XP SP3的(新)版本。

我使用名为 IBExpert 的第三方工具来查看连接数和/或运行此语句:

select * from mon$attachments;

当我查看 .close() 语句运行后与数据库的连接数时,该数字不会减少。为什么?如果我等待足够长的时间,或者如果 Tomcat 服务器重新启动,连接数确实会减少。关闭浏览器不会影响连接。

正如安德烈亚斯在评论中已经指出的那样,FBWrappingDataSource是一个连接池。这意味着池保持物理连接打开,并分发由连接池中的物理连接支持的逻辑连接。在该逻辑连接上调用close()后,物理连接将返回到池中以供重用。物理连接保持打开状态。

如果要关闭所有连接,则需要调用FBWrappingDataSource.shutdown()。这将关闭当前未使用的所有物理连接 (!),并将数据源标记为关闭。

但是,包org.firebirdsql.pool中的所有内容都应被视为已弃用;它将在 Jaybird 3 中删除。请参阅对数据源的重要更改

如果您只需要数据源,请使用org.firebirdsql.pool.FBSimpleDataSource(对于 Jaybird 3,您需要改用org.firebirdsql.ds.FBSimpleDataSource)。

如果需要连接池,请使用第三方连接池库,如 HikariCP、DBCP 或 c3p0。

也就是说,我想指出您应该考虑的几件事:

Jaybird 2.2.8
  • 不是最新版本,请考虑升级到 2.2.12,即 Jaybird 的当前最新版本。
  • 使用静态字段进行连接通常不是一个好主意(尤其是对于 Web 应用程序),如果确实需要,请考虑您的设计。您最好将数据源设置为静态字段,并获取(并关闭!)工作单元的连接(即:一个请求)。它还可能表明,仅使用DriverManager创建连接会更简单。
  • 命名约定:如果您遵循常见的 Java 约定,则应调用变量DataSourcedataSource
  • setLoginTimeout(Integer.parseInt(10))应该会导致编译错误,因为没有方法Integer.parseInt需要int,并且该方法本身已经接受int

相关内容

  • 没有找到相关文章

最新更新