【问题标题】:Spring Boot Connection Pool With Oracle SetClientInfo使用 Oracle SetClientInfo 的 Spring Boot 连接池
【发布时间】:2022-06-29 16:54:06
【问题描述】:

我正在尝试通过 Spring Boot 创建一个非常简单的服务,该服务涉及将值写入 Oracle 数据库。使用 Hikari 连接池,这应该非常简单。该服务将使用 JdbcTemplate 来调用存储过程。再次,简单。

不简单的是,作为对数据库的请求的一部分,我需要设置客户端信息 (OracleConnection.setClientInfo())。我想一次配置连接池,以便重试的任何连接都将设置此值。我试图避免手动解开连接或使用一些基于 AOP 的解决方案。

有没有一种简单的方法来做我需要的事情?

【问题讨论】:

    标签: spring oracle spring-boot


    【解决方案1】:

    我一直在研究同样的问题,这是我目前的发现:

    import javax.sql.DataSource;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class ApplicationBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            
            if(bean instanceof DataSource) {
                return new MyDataSourceWrapper((DataSource)bean);
            }
            
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        
        }
        
    }
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import org.springframework.jdbc.datasource.DelegatingDataSource;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.context.SecurityContextHolder;
    
    public class MyDataSourceWrapper extends DelegatingDataSource {
        
        public MyDataSourceWrapper(DataSource dataSource) {
            super(dataSource);
        }
    
        @Override
        public Connection getConnection() throws SQLException {
            Connection connection = super.getConnection();
    
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String currentPrincipalName = authentication.getName();
    
            connection.setClientInfo("OCSID.CLIENTID", currentPrincipalName);
            
            return connection;
        }
    
    }
    

    在数据库端,我可以使用 sys_context('USERENV', 'CLIENT_IDENTIFIER')

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2018-10-05
      • 2016-12-10
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      相关资源
      最近更新 更多