【问题标题】: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')