1

考虑以下代码:

private static void GetData<TConnection, TCommand>( string connectionString, DataTable dataFromDbf, string commandText )
  where TConnection : IDbConnection
  where TCommand : IDbCommand {
  using( IDbConnection oConn = GetConnection<TConnection>( connectionString ) ) {

    oConn.Open( );
    IDbCommand oCmd = oConn.CreateCommand( );
    oCmd.CommandText = commandText;
    dataFromDbf.Load( oCmd.ExecuteReader( ) );
    oConn.Close( );
  }
}

该方法是通用的,因为并非所有客户都有 Adavatage DB 服务器,我们需要回退到 OleDbConnection。然而,在大多数情况下,我们使用 AdsConnection 对象(来自 Advantage.Data.Provider.dll)。

上面的代码关闭连接,并且在退出 using 语句时对象被释放。

当我们使用 Advantage Management Utility 查看广告服务器上的所有连接时,我们注意到连接保持打开状态。但不是所有的!我们可能调用该方法 200 次,只有少数保持打开状态,有时超过客户端 MAX_CONNECTIONS。感谢Jens Mühlenhoff,我们可以解决这个问题。

问题是:

为什么调用 oConn.Close() 时连接没有关闭?有人有什么想法吗?

4

1 回答 1

3

你使用连接池吗?

根据 ADS 在线帮助,可能Close()并没有真正关闭连接,而是将其返回到连接池。

在这种情况下,您要么禁用池化,要么调用FlushConnectionPool(). 请注意,这会刷新整个应用程序的连接池。

http://devzone.advantagedatabase.com/dz/webhelp/Advantage10.1/dotnet_adsconnection_close.htm

http://devzone.advantagedatabase.com/dz/webhelp/Advantage10.1/dotnet_adsconnection_flushconnectionpool_.htm

于 2012-05-16T10:27:34.137 回答