在“数据库”外部打开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
}
如果出现异常,我不会在"使用"中打开连接的块是否仍会关闭它,还是保持打开状态?
如果出现异常,我不会在"使用"中打开连接的块是否仍会关闭它,还是保持打开状态?
在这两个例子中,联系仍然是开放的,直到最终确定者运行,如果有人运行的话。两者都没有"使用"dbConn
的using
。
代码:
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(); }