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

时间:2016-12-21 02:04:44

标签: java jdbc firebird jaybird

我使用以下代码连接到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();
...

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

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

select * from mon$attachments;

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

1 个答案:

答案 0 :(得分:3)

正如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))会导致编译错误,因为没有方法Integer.parseInt需要int,并且该方法本身已接受int