Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道以前是否使用过来自连接池的OracleConnection_Oracle_Ado.net_Oracle11g_Connection Pooling_Odp.net - Fatal编程技术网

如何知道以前是否使用过来自连接池的OracleConnection

如何知道以前是否使用过来自连接池的OracleConnection,oracle,ado.net,oracle11g,connection-pooling,odp.net,Oracle,Ado.net,Oracle11g,Connection Pooling,Odp.net,我的应用程序需要通过可信过程(在会话上下文中设置一些值)对数据库上的所有会话进行身份验证。当前,每个新会话打开后都会调用此过程 我现在想通过消除不必要的往返来改进这一点。以前使用过(并经过身份验证)的连接池中的连接不需要再次调用该过程,因为会话上下文变量仍在服务器上设置 但是我找不到一种方法来识别重复使用的连接。有没有办法(当然不需要往返) 体系结构:多个客户端应用程序使用同一个DB帐户(一个只读帐户,与实际模式同义)进行连接。连接后,要求每个新会话调用一个身份验证过程来设置一些会话上下文变量。

我的应用程序需要通过可信过程(在会话上下文中设置一些值)对数据库上的所有会话进行身份验证。当前,每个新会话打开后都会调用此过程

我现在想通过消除不必要的往返来改进这一点。以前使用过(并经过身份验证)的连接池中的连接不需要再次调用该过程,因为会话上下文变量仍在服务器上设置

但是我找不到一种方法来识别重复使用的连接。有没有办法(当然不需要往返)

体系结构:多个客户端应用程序使用同一个DB帐户(一个只读帐户,与实际模式同义)进行连接。连接后,要求每个新会话调用一个身份验证过程来设置一些会话上下文变量。Oracle FGAC(虚拟专用数据库)在选择/插入/更新/删除时检查这些上下文变量

我的代码:

OracleConnection conn = new OracleConnection();
conn.ConnectionString = _connectionString;
conn.Open();

if (true) { // TODO: Identify not yet authenticated connections.
   using (OracleCommand cmd = new OracleCommand("authentication.login", conn)) {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("i_user_id", OracleDbType.Int64).Value = _userId;
      cmd.Parameters.Add("i_role_id", OracleDbType.Int64).Value = _roleId;
      cmd.ExecuteNonQuery();
   }
}

您可以为oracle连接创建连接池。 您创建的每个连接都可以插入一个some键(使用
conn.setSessionInfo(key)
),稍后当您恢复连接时可以验证该键。

密钥可以是您选择的任何东西,也可以是您生成的哈希密钥。

我不清楚您的身份验证在做什么-验证连接是否来自您的应用程序?-以及你是否将任何东西传递给你的程序。你能考虑使用A来从DB侧调用你的过程,只为你的池正在使用的用户,因为会话被创建了吗?< /P> < P>我终于找到了一个答案,明确地指出这是不可能的:

< P>你应该清除所有的上下文,并且当你从连接池中获得连接时,无论如何都要重置所有的包。将此身份验证添加到初始化中


你说的“创建连接池”是什么意思?已经有一个由ODP.NET创建的连接池
SetSessionInfo()
需要一个
OracleGlobalization
对象作为参数,而不是键。也许你的意思是
ClientInfo
?但这是一个仅限集合的属性,所以我以后如何验证它呢?我编辑了我的问题,以表明我需要将数据(userId和roleId)传递给数据库进行身份验证。身份验证过程在设置上下文变量之前检查给定的ID(以及其他内容)。@KevinBurton我编辑了我的问题,以表明我需要将数据(userId和roleId)传递给DB进行身份验证。身份验证过程在设置上下文变量之前检查给定的ID(以及其他一些内容)。@KevinBurton什么用户名?你是说身份证吗?只有当用户决定切换到其他用户(帐户)时,此id才能更改。然后我再次调用身份验证过程,在会话上下文中设置新值。每个进程/连接池将永远不会有多个活动用户(帐户)。不,抱歉,有一些误解。这是一个多用户系统。单个用户仅限于每个客户端进程/线程池。因此,多个用户可以同时启动应用程序,但每个应用程序只有一个用户。我已经用架构描述编辑了我的问题。我已经测试过了,如果会话之前已经过身份验证,我不需要调用身份验证方法。连接池中的连接在服务器上仍然是已知的,并且不会丢失它们的会话上下文。