为什么我的 Java JDBC 到 Firebird 数据库的连接不会断开?
Why won't my Java JDBC to Firebird database connection disconnect?
我正在使用以下代码连接到 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 运行ing,Java 1.7 版,Jaybird 2.2.8 版,Tomcat 版7.xx 运行ning 在 Win7-32 位上,浏览器是 Chrome 版本或其他(较新)运行ning Win XP SP3。
我使用名为 IBExpert 的第三方工具查看连接数 and/or 我 运行 这个声明:
select * from mon$attachments;
当我在 .close() 语句 运行s 之后查看与数据库的连接数时,该数字并没有减少。这是为什么?如果我等待的时间足够长,或者 Tomcat 服务器重新启动,连接数确实会减少。关闭浏览器不会影响连接。
正如 Andreas 已经在评论中指出的那样,FBWrappingDataSource
是一个连接池。这意味着池保持物理连接打开,并分发由连接池中的物理连接支持的逻辑连接。在该逻辑连接上调用 close()
后,物理连接将返回到池中以供重用。物理连接保持打开状态。
如果要关闭所有连接,需要调用FBWrappingDataSource.shutdown()
。这将关闭当前未使用的所有物理连接(!),并将数据源标记为关闭。
但是,包 org.firebirdsql.pool
中的所有内容都应被视为已弃用;它将在 Jaybird 3 中删除。参见 Important changes to Datasources
如果您只需要一个数据源,请使用 org.firebirdsql.pool.FBSimpleDataSource
(对于 Jaybird 3,您需要使用 org.firebirdsql.ds.FBSimpleDataSource
)。
如果需要连接池,请使用第三方连接池库,如 HikariCP、DBCP 或 c3p0。
也就是说,我想指出您应该考虑的几件事:
- Jaybird 2.2.8不是最新版本,考虑升级到2.2.12,目前latest release of Jaybird.
- 为连接使用静态字段通常不是一个好主意(尤其是对于 Web 应用程序),如果这确实是您的需要,请考虑您的设计。您最好将数据源设为静态字段,并获取(并关闭!)一个工作单元的连接(即:一个请求)。这也可能表明您只使用
DriverManager
创建连接会更简单。
- 命名约定:如果您遵循常见的Java约定
,您的变量DataSource
应该被称为dataSource
setLoginTimeout(Integer.parseInt(10))
应该会导致编译错误,因为没有采用 int
的方法 Integer.parseInt
,并且该方法本身已经接受了 int
。
我正在使用以下代码连接到 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 运行ing,Java 1.7 版,Jaybird 2.2.8 版,Tomcat 版7.xx 运行ning 在 Win7-32 位上,浏览器是 Chrome 版本或其他(较新)运行ning Win XP SP3。
我使用名为 IBExpert 的第三方工具查看连接数 and/or 我 运行 这个声明:
select * from mon$attachments;
当我在 .close() 语句 运行s 之后查看与数据库的连接数时,该数字并没有减少。这是为什么?如果我等待的时间足够长,或者 Tomcat 服务器重新启动,连接数确实会减少。关闭浏览器不会影响连接。
正如 Andreas 已经在评论中指出的那样,FBWrappingDataSource
是一个连接池。这意味着池保持物理连接打开,并分发由连接池中的物理连接支持的逻辑连接。在该逻辑连接上调用 close()
后,物理连接将返回到池中以供重用。物理连接保持打开状态。
如果要关闭所有连接,需要调用FBWrappingDataSource.shutdown()
。这将关闭当前未使用的所有物理连接(!),并将数据源标记为关闭。
但是,包 org.firebirdsql.pool
中的所有内容都应被视为已弃用;它将在 Jaybird 3 中删除。参见 Important changes to Datasources
如果您只需要一个数据源,请使用 org.firebirdsql.pool.FBSimpleDataSource
(对于 Jaybird 3,您需要使用 org.firebirdsql.ds.FBSimpleDataSource
)。
如果需要连接池,请使用第三方连接池库,如 HikariCP、DBCP 或 c3p0。
也就是说,我想指出您应该考虑的几件事:
- Jaybird 2.2.8不是最新版本,考虑升级到2.2.12,目前latest release of Jaybird.
- 为连接使用静态字段通常不是一个好主意(尤其是对于 Web 应用程序),如果这确实是您的需要,请考虑您的设计。您最好将数据源设为静态字段,并获取(并关闭!)一个工作单元的连接(即:一个请求)。这也可能表明您只使用
DriverManager
创建连接会更简单。 - 命名约定:如果您遵循常见的Java约定 ,您的变量
setLoginTimeout(Integer.parseInt(10))
应该会导致编译错误,因为没有采用int
的方法Integer.parseInt
,并且该方法本身已经接受了int
。
DataSource
应该被称为dataSource