我的应用程序需要通过可信过程(在会话上下文中设置一些值)来验证数据库上的所有会话。目前,每个新会话在打开后都会调用此过程。
我现在想通过删除不必要的往返来改善这一点。之前使用(和验证)的连接池中的连接不需要再次调用过程,因为会话上下文变量仍在服务器上设置。
但我找不到识别重用连接的方法。有什么办法(当然也不需要往返)?
体系结构:多个客户端应用程序使用相同的数据库帐户(具有真实模式同义词的只读帐户)进行连接。在连接之后,要求每个新会话调用验证过程以设置一些会话上下文变量。这些上下文变量在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();
}
}
答案 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从数据库端调用您的过程,仅针对您的池正在使用的用户,因为会话已创建?