在“数据库”外部打开DB conn有什么影响;使用“;块

本文关键字:数据库 影响 什么 使用 DB 外部 conn | 更新日期: 2023-09-27 18:00:42

我试图在SO上搜索这个,但找不到。也许我没有正确搜索,它是某个东西的副本。

但我想问一个问题:在using(…)块内部和外部打开DB连接有什么区别。

为了澄清我的意思,请查看下面的代码片段。

我们在"使用"块外部打开数据库连接的代码段:

if (_dbConn.State != ConnectionState.Open)
            _dbConn.Open();
        using (var oraclePackage = new OraclePackage())
        { // some DB function here... }

在"使用"块内打开数据库连接的代码段:

using (var oraclePackage = new OraclePackage())
        {
            if (_dbConn.State != ConnectionState.Open)
                _dbConn.Open();
            // some DB functions here 
        }

如果出现异常,我不会在"使用"中打开连接的块是否仍会关闭它,还是保持打开状态?

在“数据库”外部打开DB conn有什么影响;使用“;块

如果出现异常,我不会在"使用"中打开连接的块是否仍会关闭它,还是保持打开状态?

在这两个例子中,联系仍然是开放的,直到最终确定者运行,如果有人运行的话。两者都没有"使用"dbConnusing

代码:

using(someObject)
{
  // More code here.
}

相当于:

try
{
  // More code here.
}
finally
{
  if(someObject != null)
    ((IDisposable)someObject).Dispose();
}

代码:

using(var someObject = new SomeClass())
{
  // More code here.
}

相当于:

var someObject = new SomeClass();
try
{
  // More code here.
}
finally
{
  if(someObject != null)
    ((IDisposable)someObject).Dispose();
}

(在对象在任何时候都不能明显设置为Null的情况下,可以优化Null检查)。

您的代码对oraclePackage执行此操作,因此oraclePackage将保证对其调用Dispose(),无论代码块是否由于异常而留下。您的代码不使用dbConn执行此操作。

因此,如果不显式调用dbConn.Dispose()dbConn.Close()dbConn.Dispose()几乎肯定会调用),则连接将不会关闭。

如果没有剩余的GC根可以访问dbConn,那么很可能最终会最终确定表示实际打开的连接的内部对象,这将导致连接关闭,但这不能保证发生或及时发生,并且它很可能不能与大多数CCD_ 11实现所使用的内部缓存机制一起很好地工作。

由于您没有在连接对象上应用using,如果发生异常,连接将保持打开状态。。。因此,即使出现异常,您也需要最终阻止关闭您的连接。

所以你的代码将是,因为你没有在连接对象上使用

try
{
  using (var oraclePackage = new OraclePackage())
    {
        if (_dbConn.State != ConnectionState.Open)
            _dbConn.Open();
        // some DB functions here 
    }
}
finally
{  _dbConn.Close(); }
Using语句不处理任何异常。它负责在当前对象(DB连接)上调用IDisposable。这意味着,无论您是在使用块内部还是外部打开连接,在块的末尾,连接都将被 处理