我有一个Web服务,用于处理插入/更新的数据到DB。当客户端调用此Web服务时, UserId (当前登录用户到门户)将在Request中发送。我需要将此userId传递给Db连接,或者在 sys context 中将其设置为审核目的。在实际表上插入/更新后,我们有现有的审计表和触发器来插入/更新Audit表。因此,为了跟踪这些更改,我需要以某种方式将此UserId传递给连接,以便可以从Sys Context或$ session中从DB检索它并在Audit表中插入。我目前正在使用Spring和Hibernate事务来处理数据库。
我尝试在Connection上设置客户端信息,但它无法正常工作。我在下面尝试过:
Session session=sessionFactory.getCurrentSession();
SessionImpl sImpl=(SessionImpl) session;
Connection connection=sImpl.connection();
connection.setClientInfo("ClientUser", "ABC");
我还试图通过调用存储过程 DBMS_APPLICATION_INFO.SET_CLIENT_INFO 来设置客户端信息,然后每次从应用程序代码执行DB操作。但如果它是正确的方法,我不会起诉处理它。
我正在尝试使用OCI和瘦JDBC驱动程序,但无法找到设置此用户ID的方法。
如果有任何有效的方法在sys上下文或Connection上传递用户ID,有人可以告诉我。我目前正在使用 hibernate4,Spring,Websphere Server,Oracle DB。
我正在使用Spring @Transactional来处理hibernate Connections和事务以在DB上执行操作。连接来自连接池,而我正在使用 org.springframework.jndi.JndiObjectFactoryBean 来获取 dataSource < / strong>即可。
当我们从连接池获得连接时,是否有任何方法可以使用拦截器或包装器来设置它。
以前有人这样做过吗?
答案 0 :(得分:1)
spring data JDBC Extensions for the Oracle Database
中对此进行了描述章
8.2自定义数据源连接准备者的配置
...但您可以实现一个使用当前用户登录ID的ConnectionPreparer。这样,即使您的数据源配置了共享用户名,也可以捕获用户登录信息。
这是oracle的解决方案,我认为你正在使用它。也应该可以将其改编为另一个数据库。