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

这些都是我试过的. 1.我将Oracle用户配置文件设置为CONNECT_TIME=1分钟. 2.我用这个档案成为了Oracle用户. 3.我制作了C#控制台AP,并使用了下面的ODP码. 4.运行AP. 5.在连接打开后停止(); 6.保持等待,直到花费超过1分钟. 7.继续运行AP. 8.Reader.Read()异常; Ex.Message是Oracle已断开连接. 我可以发现Oracle Session消失了. 这样挺好的.

问题是,如果我不继续运行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"]);
                }
            }
        }
    }
}

推荐答案

要自动终止连接超过一分钟的会话,需要为CONNECT_TIME和IDLE_TIME设置配置文件限制,并且必须在连接字符串中使用(ENABLE=BROKEN).使用这三个设置,旧会话的V$SESSION.STATUS将被设置为KILLED,并且任何相关的事务都将被回滚.

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

终止Oracle会话一直是一件痛苦的事情,try too hard终止会话可能会产生问题.我建议你降低期望值,接受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)))"

Csharp相关问答推荐

PredicateBuilder不是循环工作,而是手动工作

错误NU 1301:无法加载源的服务索引

更改对象的旋转方向

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

System.Text.Json数据化的C#类映射

如何模拟耐久任务客户端在统一测试和获取错误在调度NewsListationInstanceAsync模拟设置

(乌龙)1&#比c#中的UL&#慢吗?

限制特定REST API不被访问,但部署代码

System.Net.Http.HttpClient.SendAsync(request)在docker容器内的POST方法30秒后停止

如何使用XmlSerializer序列化带有CDATA节的XML文件?

如何使用MailKit删除邮箱?

自定义列表按字符串的部分排序

在.NET 8最低API中从表单绑定中排除属性

C#无法将.csv列转换为用于JSON转换的列表

C#System.Commandline:如何向命令添加参数以便向其传递值?

当我手动停止和关闭系统并打开时,Windows服务未启动

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

如何在Cake脚本中设置MSBuild.exe的绝对路径

项目参考和方法签名问题

反编译源代码时出现奇怪的字符