问题标签 [odp.net-managed]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oracle - ODP.NET 托管连接池每 3 分钟关闭/打开一次
我们正在使用从 Oracle 到 Oracle 12 数据库(非 RAC)配置的最新官方 ODP.NET 托管(发布时间:2015-10-14 | 版本:12.1.2400),我们无法保持数据库连接正常运行< 3 分钟。
我们的连接字符串指定:
我们也尝试过
当我们在服务器上使用 PerfMon 并观察 HardConnects/HardDisconnects 的计数器时,我们发现连接池每 3 分钟关闭并重新打开 5 个连接,这不是我们所期望的。
我们在使用 EF6 进行 DataAccess 的 web 应用和没有 ORM(只是普通的旧 SQL)的应用中都有这种行为。
根据Oracle 文档:
连接池服务在不使用时关闭连接;连接每 3 分钟关闭一次。ConnectionString 属性的 Decr Pool Size 属性为每 3 分钟可以关闭的最大连接数提供连接池服务。
对我来说 - 只要连接在生命周期限制内,有效连接的 MIN POOL SIZE 就应该比 ConnectionPool 中的 3 分钟长得多。
我们有另一个使用 Devart 的 Oracle 驱动程序的应用程序,这个驱动程序 har pooled 连接可以长时间保持活动状态。
有没有其他人在 ODP.NET 托管驱动程序中看到过 ConnectionPool 的这种“不当行为”并找到了解决方案?或者这可能是 ODP.NET 托管的 ConnectionPool 中的错误?
更新 2016.01.27:
我在我的 github 帐户上添加了一个演示应用程序来演示该问题:
https://github.com/jonnybee/OraConnTest
这只是一个小的 winforms 应用程序,您可以在其中添加连接字符串并单击按钮启动后台工作程序,该工作程序每 3 秒运行一次“SELECT 'OK' FROM DUAL”。
我的连接字符串包含: POOLING=True;MAX POOL SIZE=10;DECR POOL SIZE=1;CONNECTION LIFETIME=86400;INCR POOL SIZE=1;MIN POOL SIZE=5 + 您必须添加用户 ID、密码和数据源。
每 3 分钟,您将看到 5 个现有连接被关闭并创建 5 个新连接(MIN POOL SIZE 设置)。
运行此 SQL 以查看实际连接:select sid、logon_time、prev_exec_start、wait_time_micro/1000 from v$session where program like '%OraWinApp%' order by logon_time desc
当程序和 perfmon 正在运行时,您将看到这种行为,因为旧连接被关闭并创建了具有新 login_time 的新连接。
.net - 除非包含 LDAP.ORA,否则 ODP.NET 托管数据访问 LDAP 配置不起作用
出于某种原因,当我尝试使用 LDAP 连接到 Oracle 时,我必须在我的 .NET 项目中包含一个 LDAP.ORA 文件。根据我对使用Oracle.ManagedDataAccess nuget 包的理解,我应该能够包含 web.config 中的所有内容。 Oracle 的文档位于此处,此处提供了有用的演练。我猜我的一个配置属性有点偏离,但我无法追踪它。任何帮助将非常感激!
Oracle 配置部分
Oracle 连接字符串
连接代码
c# - DbContext 不断抛出“在创建模型时无法使用上下文。” 异常后的错误
我正在开发一个使用 Entity Framework 6、ODP.NET、Oracle Managed Driver for Entity Framework 和 Oracle 数据库的新应用程序。
我所看到的是,如果在使用 DbContext 时抛出异常,它似乎没有正确处理连接或上下文。
我正在使用 TDD 设计,我断开连接的呼叫包含在存储库类中。我正在使用以下语句包装我的 DbContext 调用:
主上下文:
如果在诸如 foreach 循环之类的 using 语句中引发异常,然后对使用 DbConext 的其他存储库的后续请求,我将看到此错误:
创建模型时不能使用上下文。如果在 OnModelCreating 方法中使用上下文,或者多个线程同时访问同一个上下文实例,则可能会引发此异常。请注意,不保证 DbContext 和相关类的实例成员是线程安全的。"、
"ExceptionType": "System.InvalidOperationException"、"StackTrace": " at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()\r \n 在 System.Data.Entity.Internal.InternalContext.Initialize()\r\n 在 System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)\r\n 在 System.Data.Entity.Internal.Linq .InternalSet1.Initialize()\r\n at System.Data.Entity.Internal.Linq.InternalSet
1.GetEnumerator()\r\n
在 System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()\r\n
要解决这个问题,我必须停止调试和 IIS Express。过去在 SQL Server 和 EF5 中使用 EF 时,我从未见过这种情况。
我的问题是:如果在使用 DbContext 时抛出异常时我应该做更多工作以确保正确关闭 DbContext 和连接?
oracle - 如何在 .net 3.5 和 .net 4 中运行 odp.net 应用程序
我正在为我们的产品开发一个内部工具。我们的产品使用 oracle 数据库,并且随着时间的推移从 .net framework 2.0 发展到 4.5,Oracle 10 发展到 12.2。
该工具的目的是编写一个适用于不同产品版本的应用程序。
我通过在 app.config 中使用以下条目解决了多个 .net 框架版本的问题
由于框架> = 4.0支持oracle管理的.net驱动程序,因此我不能使用它,因为我还必须支持.net framework 3.5。
由于我必须使用非托管 odp.net 驱动程序,我正在考虑以下场景
- 我的工具将使用最低版本的 oracle.dataaccess.dll 和目标 .net 3.5。
- 在上面的#1 之后,我参考了 oracle.dataaccess.dll 的 2.xx.... 版本。
当我在仅安装 .net framework 4 的机器上运行此应用程序时,会出现什么行为?在 .net framework 4 的上下文中运行时会加载 4.xx... 版本的 oracle.dataaccess dll 吗?
最好的解决方案是 .net 3.5 版本的 oracle 托管驱动程序的可用性,但我发现它不可用。
请提供您宝贵的意见。
萨蒂什
更新:我编写了一个针对 .net framework 3.5 的示例应用程序。在这个示例应用程序中,我将构建一个连接字符串,然后打开一个连接并关闭它。
当 app.config中没有<supportedRuntime>
标签时,此应用程序成功运行。
当我们在 app.config 中添加任何<supportedRuntime>
标签时,我会收到与 oracle 相关的类型的类型初始化程序异常。我已经用受支持的运行时标签尝试了这个
单独和两者结合。但我仍然遇到问题。谁能建议如何解决这个问题?
odp.net-managed - ORA-12570: 网络会话 - 运行 20 多分钟后
我们收到网络会话错误。
“ORA-12570:网络会话:意外的数据包读取错误”。
这是在运行查询 20-21 分钟之后发生的。如果我运行单个查询或多个查询,它会在所有情况下始终抛出此错误。
直到 20 分钟它工作正常,日志显示一切正常。我们正在获取 prod 日志记录以将其存储在主 csv 文件中。日志记录数以百万计,需要很长时间才能获取。它一直成功运行到上个月。
- 我通过nuget获取了最新的ODP.net“Oracle.ManagedDataAccess.12.1.24160419”。
- 尝试了各种池选项。即使集中起来也无济于事。
我该如何解决错误。提前感谢您的帮助。
oracle - ODP.net - ORA-12537 调用存储过程时出现文件结尾错误
我对上述情况感到困惑,每当我在我们的新 Oracle 安装包中执行存储过程时,它就会间歇性地出现。
sproc 是从 WCF 调用的,它返回以下异常:
它似乎也没有模式 - 有时它工作正常,有时它没有。
这是我尝试过的东西:
- 检查 GAC 以确保不存在多个版本的 ODP。托管数据访问组件已从 nuget 导入 - 版本为 12.1.2400。
- 为要排序的连接字符串添加了各种属性 - 即持久安全信息=True;Self Tuning=True;Min Pool Size=3;Max Pool Size=25;Incr Pool Size=3;Decr Pool Size=1;Connection Timeout=20 ;Pooling=false;连接寿命=59; - 尝试了各种配置但没有运气,例如将池设置为 false/true 等。
确保在通用代码中处理对象。这是当前使用的测试代码:
/li>将存储过程中的查询减少为“固定”值 - 以确保存储过程中没有任何内容导致问题。我确实发现了一些有趣的问题,如下所述。
所以,我很茫然。我打开了 ODP 跟踪 - 并且确实注意到它在处理池时似乎有问题。第一次,我得到了这个:
将跟踪提高到 127,我得到了这个:
我通过注释掉 select 语句和 where 子句来调整存储过程中的查询,并逐渐将它们重新引入以查看问题是否出在查询中(尽管在 Oracle Developer 中运行它可以正常工作)。我已经把它缩小到这个声明 - 如果我重新引入它,我会再次得到文件结束异常:
这就是包中 ISNUMERIC 函数的样子;
起初我认为可能是捕获的异常数量由于异常数量而阻止了进一步的执行。但是,我将函数简化为仅返回 '1',但每次都无法正常工作。
查询的结果通过引用游标传回,例如
最后,我从 select 语句和 where 子句中删除了所有 Function 调用——这立即阻止了错误的发生——我用函数运行的相同逻辑替换了它们——只是在 SELECT 和 WHERE 语句中内联。
发生什么了?在包含函数调用的包中运行存储过程时,ODP.net 是否存在限制?似乎有点奇怪。
解决方法是不使用函数,但我不想这样做,因为某些选择语句中有条件表达式,它们在基于联合的查询中重复相同的逻辑。
非常感谢任何帮助或指示!
附言。为了透明起见,我上周在 Oracle 论坛上发布了这篇文章,但没有得到任何回复。
更新:2016 年 8 月 3 日
最后设法访问服务器以尝试一些跟踪。以下是进程过早结束时跟踪日志中出现的内容:
我还可以在同一文件夹中看到核心转储。我尝试在其中 grepping 存储桶跟踪文件,看看是否有任何明显的东西 - 但老实说,当你不知道你在寻找什么时,很难搜索到一些东西!
每当它使用函数时,我可以看到之前尝试运行存储过程的核心转储 - 所以它至少是相当一致的。
c# - C#:使用存储过程和 ODP.NET 更新 BLOB 时出现错误 ORA-06550
ORA-06550:第 1 行,第 7 列:PLS-00306:调用“UPDATEPHOTO”时参数的数量或类型错误
ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略Oracle.ManagedDataAccess.Client.OracleException
我不知道程序或我的代码有什么问题。
这是我的存储过程
这是我的 C# 代码:
c# - C# ODB.NET Out 参数始终为 DBNull
我在 Oracle SQL Server 的包中有一个存储过程。这个过程有输入和输出参数。该过程本身有效,当在 Oracle SQL Developer 中执行时,输出参数读取预期的输出(最后一行的列值)。此过程必须由 Web API 通过 ODP.NET(Oracle 托管数据访问)调用。
问题:永远不会返回输出参数(ODP 中的 Long 类型和 db 中的 NUMBER(12,0) 类型)。执行命令后输出参数始终为 DBNull。
以下是我的代码的相关部分(其他参数省略): 打包过程:
使用的参数:
C#中的调用代码:
如您所见,我知道如何检查 DBNull 值,但这不是问题。它不应该获得 DBNull 值。
到目前为止我尝试过的一些事情:
- 将 Parameter DBType 更改为 Int64 和其他(与其他人一起,我正确地得到了关于参数类型的错误)
- 将 event_id 硬编码为一个值 (event_id := 1234567;)
- 在数据库中直接在过程之外执行 SELECT MAX(... 查询。
尽管 SQL Developer 可以按预期工作,但我尝试的一切。将输出参数传输到调用 C# API 是有问题的。我用谷歌搜索了很多,也搜索了 Stackoverflow,所以我希望有人能帮助我找到一个可行的答案。
c# - OracleManagedDataAccess - 即使在使用信号量时连接请求超时
我有一个基本上更新单个 Oracle 表的约 30,000 行的过程。
我在 Sempahore 限制批次中同时执行此操作,一次 20 个。我目前将我的 OracleManagedDataAccess 连接池设置为 20 min pool size 和 200 max pool size。我在运行期间监控数据库,并且总是有 20 个打开的连接,它永远不会超过那个。但是,我仍然收到连接请求超时,这是不可预测的,有时我会超时,有时我不会。我的超时当前设置为 30 秒。我不知道为什么我会超时。下面是我正在做的事情。
我的 UpdateMeterStatus 和数据库访问代码如下
任何人都能够帮助弄清楚为什么它会抛出连接请求超时错误?我正在使用 Oracle.ManagedDataAccess 4.121.1.0
c# - 托管Oracle访问,支持“≤”
我们已经在我们的 Winform 应用程序中从非托管 Oracle 切换到托管 Oracle,除了一个细节之外,一切都运行良好。如果我将字符串保存"≤"
到数据库然后尝试再次检索它,我会"="
回来。它以 nvarchar 形式存储,我可以(通过 Toad)看到它实际上保存为"≤"
. 当我们运行非托管数据访问时,我们使用"NLS_LANG = SWEDISH_SWEDEN.WE8MSWIN1252"
了但据我所知,托管驱动程序不支持此功能。托管驱动程序应该使用 .NET 语言环境,并且其中的代码页设置为1252
. 有没有人看到这个,也许找到了解决方案?