【发布时间】:2017-11-27 23:20:13
【问题描述】:
即使我像下面这样重写代码,Oracle 连接也不会关闭。我有 3 种类型的 Oracle 连接,如 DataReader、DataAdapter 和 Normal。
我错在哪一部分?
Type:1 - Datareader 连接
using (OracleConnection con = new OracleConnection(oradb))
{
con.Open();
using (OracleCommand cmd1 = new OracleCommand("select sql_fulltext \"SQL Text\" from gv$sqlarea where rownum<2 and sql_id='" + sqlid + "'", con))
{
OracleDataReader dr1 = cmd1.ExecuteReader();
dr1.Read();
rtbSQLDetails.Text = dr1.GetString(0);
}
}
类型:2 数据适配器连接
using (odagetInstID = new OracleDataAdapter("select distinct INST_ID from gv$instance where status='OPEN'", oradb))
{
odagetInstID.Fill(dtInstID);
}
类型:3 个普通连接
using (var con = new OracleConnection(oradb))
{
con.Open();
//...
}
【问题讨论】:
-
一些提供商故意保留底层连接的内部池,以减少打开连接时的延迟。这意味着 底层 连接将比
DbConnection实例寿命更长。SqlClient当然会这样做。OracleConnection是否可能只是在做同样的事情?如果是这样,您可以可能禁用连接字符串中的池,但这通常是个坏主意。编辑:“使用连接池”部分here 听起来很可能。 -
对于速度和/或缓存,我认为这就是您所看到的......您现有的代码没有问题。更不用说如果代码被多次调用,在离开 using(){ } 代码块时将创建新实例然后 Disposed 。如果您的代码存在打开连接问题,则有关已打开连接的 Oracle 异常肯定会引发错误。