如何使用 ODP.NET C# 限制 Oracle 会话时间长度

问题描述 投票:0回答:1

我想知道Oracle如何在有限的时间内杀死会话 在 ODP.Net 上。

这些是我尝试过的。 1.我将 Oracle 用户配置文件设置为 CONNECT_TIME = 1 分钟。 2.我用这个配置文件创建了Oracle用户。 3.我用ODP制作了C#控制台AP,如下所示。 4.运行应用程序。 5.Conn.Open()后停止; 6.保持等待直至超过1分钟。 7.继续运行AP。 8. reader.Read() 发生异常; ex.message 是 Oracle 已断开连接。 我可以发现Oracle会话消失了。 这很好。

问题是如果我不继续运行 AP(#7), 那么就没有异常了。 如果没有发生异常,Oracle 不会终止会话。

using Oracle.ManagedDataAccess.Client;

class Test1
{
    static void Main()
    {
        using (OracleConnection conn = new OracleConnection("connect string"))
        {
            conn.Open();
            using (OracleCommand cmd = new OracleCommand("select id from test_table"))
            {
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                using (OracleDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                        Console.WriteLine(reader["id"]);
                }
            }
        }
    }
}

c# oracle odp.net
1个回答
0
投票

要自动终止连接时间超过一分钟的会话,您需要为 CONNECT_TIME 和 IDLE_TIME 设置配置文件限制,并且必须在连接字符串中使用

(ENABLE=BROKEN)
。通过这三个设置,旧会话的
V$SESSION.STATUS
将设置为
KILLED
,并且任何相关事务都将回滚。

KILLED
的状态表示大部分会话资源已被释放。例如,任何未提交的事务都被回滚。然而,该会话仍然存在于
V$SESSION
中,并且Oracle没有内置机制来完全销毁这些会话。如果您绝对需要删除这些行,则需要强制客户端尝试运行命令,或者需要创建一个作业来运行 PL/SQL 命令或操作系统命令。一些消息来源声称 Oracle 的 PMON 进程最终将完全清理会话,但我无法在 Windows 10 Pro 的 19c 企业版上重现该行为。

终止 Oracle 会话一直是一件痛苦的事情,并且“太努力”地尝试终止会话可能会导致问题。我建议您降低期望并接受STATUS='KILLED'已经足够好了。

下面是一些用于创建和应用相关配置文件以及如何连接 SQL*Plus 的示例代码。不过,我不确定如何格式化 C# 连接。

create profile test_profile limit connect_time 1 idle_time 1; create user test_user identified by test_user profile test_profile; D:\>sqlplus test_user/test_user@"(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS=(PROTOCOL=TCP)(HOST=host_name_here)(PORT = 1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orclpdb.Home)))"

© www.soinside.com 2019 - 2024. All rights reserved.