Ade*_*SIF 2 c# powershell odp.net powershell-3.0 oracle-manageddataaccess
这是我的powershell代码:
[void][System.Reflection.Assembly]::LoadFile("C:\DLL\Oracle.ManagedDataAccess.dll")
$OracleConnexion = New-Object Oracle.ManagedDataAccess.Client.OracleConnection('User Id=test;Password="test";Data Source=10.2.2.1/TEST')
$TimeOut = 60
$OracleConnexion.Open()
$Query=$OracleConnexion.CreateCommand()
$Query.CommandText="Select * FROM TEST"
$Query.CommandTimeout = $Timeout
$ExecuteRequete=$Requete.ExecuteReader()
while ($ExecuteRequete.Read()) {
$SiebelLastRecord += $ExecuteRequete.GetDateTime(0).ToString()
}
$OracleConnexion.Close()
Run Code Online (Sandbox Code Playgroud)
所以我打开ODP.NET连接$OracleConnexion.open()然后关闭它$OracleConnexion.close()是否足以正确关闭我与Oracle数据库的连接?或者我应该使用$OracleConnexion.Dispose()?
我通过任务调度程序每隔5分钟执行一次PowerShell ...所以也许我应该使用Dispose()来避免内存饱和?
关闭关闭连接并允许您再次重新打开它.
处理如果尚未关闭则关闭连接并处理它,以便您不能再次重新打开它.
使用dispose - dispose释放资源的内存,如果该资源是打开的,那么表现良好的.dispose方法将关闭资源.
使用ConnectionPooling处理Dispose()与Close():https: //community.oracle.com/thread/165664?start = 0&tstart = 0
它看起来像其他人一样,我注意到你在使用powershell.在那种情况下,它并不重要. 无论如何,当shell结束时,一切都会被清理干净.我想你可以添加[catch]并关闭/处理那里的连接,如果它仍然打开,但我认为只有你计划让你的脚本继续下去才有必要.
我将在下面留下我的longwinded c#答案.尽管它并不真正适用于您的脚本,但它解释了差异(或缺乏).
答案简短(对于c#):
using (var conn = new OracleConnection(connectionString))
{
}
Run Code Online (Sandbox Code Playgroud)
"using"确保即使抛出异常,也会在块的末尾调用.dispose.这样你就不会冒险将连接孤立起来,直到垃圾收集最终完成清理并且在用完数据库连接后可能会很好.
答案很长:
使用反射器,您将看到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);
}
}
Run Code Online (Sandbox Code Playgroud)
有什么真正的区别吗?否 - 非托管资源是与之关联的连接.关闭.如果你在finally块中检查了连接状态并且在那里调用了.Close,那么你看不到任何功能差异(延迟跟踪除外).
OracleConnection conn = null;
try
{
conn = new OracleConnection(connectionString);
}
finally
{
if(conn.State != ConnectionState.Closed)
conn.Close();
}
Run Code Online (Sandbox Code Playgroud)
也就是说,idisposible对象的推荐模式是使用"使用"块.是的,我认为您可以选择以close方式重新打开连接,但我认为这不是一件有用的事情.
如果您在使用或不使用,并最终抛出一个异常并关闭/处置不会被调用,然后释放到数据库的连接将是不确定的 - 处置(假)每当垃圾收集得到周围会发生这种事 - 在用完与数据库的连接后可能需要很长时间.
OracleConnection conn = null;
conn = new OracleConnection(connectionString);
conn.Open();
//exception occurs - Close is never called - resource leak!!
conn.Close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11461 次 |
| 最近记录: |