它看起來像其他人,我注意到你很晚才知道你在使用PowerShell。在這種情況下,這並不重要。無論何時shell都會結束,所有內容都將被清理乾淨。我想你可以添加一個[catch],也許關閉/處理連接,如果它仍然是開放的,但我認爲只有當你計劃讓腳本繼續時纔有必要。
我會在下面留下我的longwinded c#答案。儘管它並不適用於您的腳本,但它解釋了其差異(或缺乏)。
簡短的回答(對於C#):
using (var conn = new OracleConnection(connectionString))
{
}
「使用」確保.Dispose被稱爲在即使有異常拋出的塊的結束。這樣,你永遠不會冒着連接被孤立的危險,直到垃圾收集最終得到清理,並且在你用完數據庫連接之後可能會很好。
長的答案:
使用反射,你會看到,處置調用Close:
protected override void Dispose(bool disposing)
{
if (ProviderConfig.m_bTraceLevelPublic)
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Entry);
this.m_disposed = true;
this.m_dataSource = string.Empty;
this.m_serverVersion = string.Empty;
try
{
bool flag = this.m_connectionState == ConnectionState.Closed && this.m_oracleConnectionImpl == null;
try
{
if (!disposing)
{
if (!flag)
{
if (OraclePool.m_bPerfNumberOfReclaimedConnections)
OraclePool.PerformanceCounterIncrement(OraclePerfParams.CounterIndex.NumberOfReclaimedConnections, this.m_oracleConnectionImpl, this.m_oracleConnectionImpl.m_cp);
}
}
}
catch (Exception ex)
{
if (ProviderConfig.m_bTraceLevelPublic)
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Error, ex.ToString());
}
if (!flag)
{
try
{
this.Close();
}
catch (Exception ex)
{
if (ProviderConfig.m_bTraceLevelPublic)
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Error, ex.ToString());
}
}
try
{
base.Dispose(disposing);
}
catch (Exception ex)
{
if (ProviderConfig.m_bTraceLevelPublic)
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Error, ex.ToString());
}
try
{
GC.SuppressFinalize((object) this);
}
catch (Exception ex)
{
if (!ProviderConfig.m_bTraceLevelPublic)
return;
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Error, ex.ToString());
}
}
catch (Exception ex)
{
if (!ProviderConfig.m_bTraceLevelPublic)
return;
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Error, ex.ToString());
}
finally
{
if (ProviderConfig.m_bTraceLevelPublic)
Trace.Write(OracleTraceLevel.Public, OracleTraceTag.Exit);
}
}
有什麼真正的區別?否 - 非託管資源是需要處理的連接。關閉。如果您在finally塊中檢查了連接狀態,並且調用了.Close,如果它仍然處於打開狀態,您將看不到任何功能差異(延遲跟蹤除外)。
OracleConnection conn = null;
try
{
conn = new OracleConnection(connectionString);
}
finally
{
if(conn.State != ConnectionState.Closed)
conn.Close();
}
也就是說,推薦的不可分配對象模式是使用「使用」塊。是的,我認爲你可以選擇重新打開連接,但我認爲這不是一件有用的事情。
如果你沒有使用一個或最後和拋出一個異常,並關閉/處置不會被調用,然後釋放到數據庫的連接將是不確定的使用 - 當垃圾收集處置了(假)會發生圍繞它 - 這可能會很長時間後,你連接到你的數據庫。
OracleConnection conn = null;
conn = new OracleConnection(connectionString);
conn.Open();
//exception occurs - Close is never called - resource leak!!
conn.Close();
最好的做法是調用Dispose(),特別是如果使用ODP.NET非託管。原因在於垃圾收集器清理速度可能很慢,並且可能導致問題,例如連接/光標過多打開太久。 –