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

时间:2011-09-20 06:04:40

标签: oracle ado.net oracle11g connection-pooling odp.net

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

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

但我找不到识别重用连接的方法。有什么办法(当然也不需要往返)?

体系结构:多个客户端应用程序使用相同的数据库帐户(具有真实模式同义词的只读帐户)进行连接。在连接之后,要求每个新会话调用验证过程以设置一些会话上下文变量。这些上下文变量在Oracle FGAC(虚拟专用数据库)的select / insert / update / delete上进行检查。

我的代码:

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

4 个答案:

答案 0 :(得分:1)

您可以为oracle连接创建连接池。 您创建的每个连接都可以插入一些密钥(使用conn.setSessionInfo(key)),以后可以在您恢复连接时进行验证。
键可以是您选择的任何东西,也可以是您生成的哈希键。

答案 1 :(得分:1)

从连接池获得连接时,无论如何都应清除所有上下文并重置所有程序包。将此身份验证添加到您的初始化中。

Preparing an Oracle Connection after being retrieved from a ConnectionPool

答案 2 :(得分:0)

我终于找到了一个明确表明这是不可能的答案:ODP.NET connection pooling: How to tell if a connection has been used

答案 3 :(得分:-1)

我不清楚您的身份验证正在做什么 - 验证连接是否来自您的应用? - 以及你是否将任何东西传递给你的手术。您是否可以考虑使用logon trigger从数据库端调用您的过程,仅针对您的池正在使用的用户,因为会话已创建?