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

时间:2016-08-29 14:44:54

标签: c# oracle nhibernate proxy odp.net

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

最初测试过,一切似乎都很好。现在我们正在测试多个用户并遇到问题。首先进入的人似乎是在数据库中捕获的唯一用户(至少有一段时间)。我怀疑这是由于客户端连接池,第一个人获得连接然后断开连接。下一个人点击Web服务器,ODP.Net为该人提供另一个连接。我只能假设它没有正确地改变用户。

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

我们使用的是64位11g(11.2.0.4.0)和4.112.3.0的ODP.Net,并且只使用客户端的连接池;我们不使用数据库驻留连接池(DRCP)。

我们的连接字符串: 数据源= myOracleDB;代理用户ID = pUserId;代理密码= pPassword;用户ID = myUsername;

1 个答案:

答案 0 :(得分:0)

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

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