之前有想过:
1. 根据请求参数,在拦截器中动态的创建对应数据源,连接session和事务,注入spring容器中
2. 预先将所有数据源添加到容器,从容器中获取对应数据源,再生成连接sessino和事务注入容器,和第一种差不多,但是spring提供的这个AbstractRoutingDataSource相当给力,用一个路由数据源代替真正的数据源使用@Primary注解在调用的时候动态切换数据源,真香
RoutingDataSource
public class RoutingDataSource extends AbstractRoutingDataSource { final Logger logger = LoggerFactory.getLogger(getClass()); @Override protected DataSource determineTargetDataSource() { DataSource ds = super.determineTargetDataSource(); logger.error("determin target datasource: {}", ds); return ds; } @Override protected Object determineCurrentLookupKey() { // 从ThreadLocal中取出key: return RoutingDataSourceContext.getDataSourceRoutingKey(); } }
RoutingDataSourceContext
public class RoutingDataSourceContext implements AutoCloseable { static final ThreadLocal<String> ctx = new ThreadLocal<>(); public static void setDataSourceRoutingKey(String str) { ctx.set(str); } public static String getDataSourceRoutingKey() { return ctx.get(); } @Override public void close() throws Exception { ctx.remove(); } }
Sign in to make a reply
好先生的菜
之前有想过:
1. 根据请求参数,在拦截器中动态的创建对应数据源,连接session和事务,注入spring容器中
2. 预先将所有数据源添加到容器,从容器中获取对应数据源,再生成连接sessino和事务注入容器,和第一种差不多,但是spring提供的这个AbstractRoutingDataSource相当给力,用一个路由数据源代替真正的数据源使用@Primary注解在调用的时候动态切换数据源,真香
RoutingDataSource
RoutingDataSourceContext