如何正确关闭 ODP.net 连接:dispose() 或 close()?

2023-12-09

这是我的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()

所以我打开 ODP.NET 连接$OracleConnexion.open()然后用关闭它$OracleConnexion.close()正确关闭与 Oracle 数据库的连接是否足够?或者我应该使用$OracleConnexion.Dispose() ?

我通过任务调度程序每 5 分钟执行一次 powershell...那么也许我应该使用 Dispose() 来避免内存饱和?


看起来和其他人一样,我最近注意到你在 powershell 中。在这种情况下,这并不重要。无论如何,当外壳结束时,一切都会被清理干净。我想你可以添加一个 [catch] 并可能关闭/处置那里的连接(如果它仍然打开),但我认为只有当你计划让你的脚本继续时才有必要。

我将在下面留下我冗长的 C# 答案。尽管它并不真正适用于您的脚本,但它解释了差异(或缺乏差异)。

简短的答案(对于 c#):

using (var conn = new OracleConnection(connectionString))
{
}

“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);
  }
}

有什么真正的区别吗?否 - 非托管资源是使用 .Close 处理的连接。如果您在finally 块中检查连接状态并在连接仍处于打开状态时调用.Close,那么您不会发现任何功能差异(除了延迟跟踪)。

  OracleConnection conn = null;
  try
  {
    conn = new OracleConnection(connectionString);
  }
  finally
  {
    if(conn.State != ConnectionState.Closed)
      conn.Close();
  }

也就是说,对于不可处理对象的推荐模式是使用“using”块。是的,我认为您确实可以选择通过关闭重新打开连接,但我认为这不是一件有用的事情。

如果您没有使用 using 或 finally 并且抛出异常并且从未调用 close/dispose,则释放与数据库的连接将是不确定的 - 每当垃圾收集器处理它时就会发生 Dispose(false) -这可能是在您耗尽与数据库的连接之后很长一段时间。

    OracleConnection conn = null;
    conn = new OracleConnection(connectionString);
    conn.Open();

    //exception occurs - Close is never called - resource leak!!

    conn.Close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确关闭 ODP.net 连接:dispose() 或 close()? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 通过PowerShell检索Azure AD应用程序的“API权限”

    出于报告和监视的目的 我想检索应用程序 应用程序注册 的 Azure 门户中显示的信息以获取 API 权限 我尝试过以下代码 app Get AzureADApplication ObjectId aa7e174d 2639 4ac7 9b
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 在 Windows 上不使用 OpenSSL 从 pfx 文件或证书存储中提取私钥

    正如标题所示 我想在不使用 OpenSSL 或任何其他第三方工具的情况下导出我的私钥 如果我需要一个 cer文件或 pfx我可以通过 MMC 或 PowerShell 轻松导出这些文件pkiclient但我找不到获取私钥的方法 https
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • opencv中的缩放和旋转模板匹配

    I want to use a template image to search target in the another image But the target have scale and rotation change also
  • 使用 jquery 预加载图像数组

    我正在使用 jQuery 从 php 数组构建图像数组 我想循环浏览这些图像 预加载它们 同时显示一些加载 gif 直到加载所有图像 目前 我已经尝试了很多方法来这样做 页面的其余部分似乎总是在继续加载 因此图像正在被预加载 但不是在页面加
  • ApplicationInsights OperationId 为空

    我正在实现自定义 ApplicationInsights 记录器 并且能够在跟踪 异常和请求等写入位置写入所有日志 但跟踪和异常中的 OperationId 为空 昨天我使用相同的代码并在所有表中获取OperationId 之后我玩了多线程
  • Rails 从 JSON 数组中选择

    我有一个从 Foursquare 返回的 JSON 数组 我们就这样称呼它吧 venues 我希望能够通过下拉框 选择 场地 并且我希望它成为表单的一部分 这意味着我希望能够按名称选择特定场地 即本例中为 Hotel Utah Saloon
  • 关于使用 Installshield 2013 (.issuite) 项目文件生成的 Setup.exe 进行静默安装

    我有一个使用 installshield 套件项目 issuite 文件生成的 setup exe 文件 对于具有足够权限的管理员或普通用户 我们的 IT 管理员之一可以使用以下命令进行静默安装 setup exe silent 但是 当尝
  • 按本地化排序列表

    我需要排序一个List
  • 通过jquery获取对象数组的索引

    我有以下数组 var array id aa description some description id bb description some more description id cc description a lot of d
  • 在 OSX Yosemite 上的 Emacs 中使用 LLVM 调试器

    我想知道是否可以将 LLVM 调试器与 Emacs 一起使用 例如M x gdb接口标准 提前致谢 令人惊讶的是 向 Emacs 添加 LLVM 调试器支持是有争议的 或者没有争议 取决于您的愤世嫉俗程度 2015年2月 理查德 斯托曼写道
  • 操作系统导致的 irq 延迟是多少?

    如何估计 ARM 处理器上的 irq 延迟 irq 延迟的定义是什么 中断请求 irq 延迟是中断请求从中断源传输到被服务点所需的时间 因为有不同的中断通过不同的路径来自不同的源 显然它们的延迟取决于中断的类型 您可以找到有关特定中断的延迟
  • web.config 中的 C# 命名空间

    来自 VB 背景并被迫学习 C 的我遇到了第一个障碍 在 VB 中 我可以将我想要在整个应用程序中可用的所有命名空间放入 web config 文件中 并且它将在每个代码隐藏文件中可用 而无需添加导入语句
  • 在单体 SpringBoot 应用程序中创建集成测试

    我被要求为一个非常大的 SpringBoot 项目中的一个服务创建一个集成测试 该项目产生了数十个已实现的服务 执行应用程序时 会部署所有这些服务 我想避免部署与我正在为其创建测试的服务无关的所有服务 不幸的是 我 还 没有像我希望的那样有
  • ViewBox 使 RichTextBox 失去插入符

    RichTextBox 放置在 ViewBox 内并缩放至 10 1000 的各个级别 当百分比小于 100 时 插入符号会在随机光标位置消失 我知道当视觉效果被缩小 压缩 时 它会丢失像素 有什么办法可以让我不再丢失光标吗
  • create-react-app 和节点服务器的 ECONNREFUSED 错误

    我正在使用 create react app 因此没有自定义 webpack 和节点服务器构建 MERN 应用程序 我正在使用 nodemon 重新启动后端上的更改 问题是大约一半的时间似乎我的前端尝试在 nodemon 重新启动节点服务器
  • jQuery .click() 不起作用?

    我在 html 表中生成了一组按钮 如下所示 然后我想在单击时调用该函数 each childData function key item var packPath key replace g Replace underscore with
  • 根据第一个非零将数字舍入到最接近的“nth”

    我想将 Double 舍入到小数点后最接近的非零数字 例如 x 0 002341 rounded 0 002 x 0 000048123 rounded 0 00005 对于基数 gt 0 的情况 应该这样执行 x 1 000234 rou
  • 将列表向量转换为向量向量

    我的 txt 文件中有以下数据 1 John Smith 123 Here Street 456 4567 2 Sue Jones 43 Rose Court Street 345 7867 3 Fan Yuhong 165 Happy L
  • 创建转弯导航 iPhone 应用程序

    我正在尝试构建一个像 TomTom 或 Mapquest 这样的路线导航应用程序 并且我正在寻找一些入门帮助 以获取可用选项和许可 如果有 从技术上讲 我认为通过 Core Location 在地图上绘制当前位置或地址相当容易 但我有一些更
  • null 在此代码中如何工作? [复制]

    这个问题在这里已经有答案了 null 在此代码中如何工作 为什么它不打印对象 class Test1 public void doStuff Object o System out println In Object public void
  • 使用 MongoDB / Meteor 更新数组中的特定元素

    users voted user id AQG8ECLdBRJ4jwPMG score down 想知道我将如何更新users votedfield 是一个数组对象 我需要更新一个特定的对象 我知道index该对象所在的位置 我只需要弄清楚
  • 如何正确关闭 ODP.net 连接:dispose() 或 close()?

    这是我的powershell代码 void System Reflection Assembly LoadFile C DLL Oracle ManagedDataAccess dll OracleConnexion New Object