Oracle代理用户和客户端连接池

本文关键字:连接 客户端 代理 用户 Oracle | 更新日期: 2023-09-27 18:04:45

对于内部web应用程序,我们决定使用Oracle的代理身份验证,以便获得连接池的好处,但仍然将实际用户传递给数据库。它的主要用途是让触发器获取用户名并插入一个Modified By字段。

最初测试了它,一切似乎都很好。现在我们正在对多个用户进行测试,并且遇到了一些问题。首先进入的用户似乎是数据库中唯一被捕获的用户(至少在一段时间内是这样)。我怀疑这是由于客户端连接池,其中第一个人获得连接,然后断开连接。下一个点击网络服务器和ODP的人。网络给了那个人另一种联系。我只能假设它没有正确地改变用户。

这是预期的行为还是客户端的问题?

我们使用64位11g(11.2.0.4.0)与ODP。Net版本4.112.3.0,只使用客户端连接池;我们没有使用数据库驻留连接池(DRCP)

连接字符串:数据源= myOracleDB;代理用户Id=pUserId;代理密码=pPassword;用户Id;上的用户名都= dangillmor

Oracle代理用户和客户端连接池

找到问题了。我没有提到我们正在使用ORM, NHibernate。这就是造成问题的原因。连接字符串被设置为NHibernate的会话工厂设置的一部分,它应该被设置为一次性设置对象。这导致所有的NHibernate会话都是用相同的连接字符串(和用户名)创建的。这将持续会话工厂的生命周期。

解决方案是重写NHibernate的DriverConnectionProvider类并重写ConnectionString属性来设置ConnectionString以包含当前用户。然后在web.config中指定以下内容:
<property name="connection.provider">MyConnectionProvider, MyAssembly</property>