1

我正在使用以下代码连接到 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 服务器重新启动,连接数确实会减少。关闭浏览器不会影响连接。

4

1 回答 1

4

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

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

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

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

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

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

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