栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将Spring AbstractRoutingDataSource与动态数据源一起使用?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将Spring AbstractRoutingDataSource与动态数据源一起使用?

没有任何

AbstractRoutingDataSource
强制你使用的静态映射DataSourceS。构造一个bean实现由你自己决定
Map<Object, Object>
,其中key是用来选择的DataSource,而value是一个DataSource或(默认情况下)引用JNDI定义的数据源的String。你甚至可以动态修改它,因为当映射存储在内存中时,
AbstractRoutingDataSource
不进行缓存。

我没有完整的示例代码。但是这是我可以想象的。在Web应用程序中,每个客户端都有一个数据库,所有数据库都具有相同的结构-好的,这是一个奇怪的设计,说它只是用于示例。在登录时,应用程序为客户端创建数据源并将其存储在由sessionId索引的映射中-该映射是根上下文中的Bean,名为

dataSources

@Autowired@Qualifier("dataSources");Map<String, DataSource> sources;// I assume url, user and password have been found from connected user// I use DriverManagerDataSource for the example because it is simple to setupDataSource dataSource = new DriverManagerDataSource(url, user, password);sources.put(request.getSession.getId(), dataSource);

你还需要一个会话侦听器来清理

dataSources
destroy
方法

@Autowired@Qualifier("dataSources");Map<String, DataSource> sources;public void sessionDestroyed(HttpSessionEvent se)  {    // eventually cleanup the DataSource if appropriate (nothing to do for DriverManagerDataSource ...)    sources.remove(se.getSession.getId());}

路由数据源可能类似于:

public class SessionRoutingDataSource extends AbstractRoutingDataSource {    @Override    protected Object determineCurrentLookupKey() {        HttpServletRequest request = ((ServletRequestAttributes)     RequestContextHolder.getRequestAttributes()).getRequest();        return request.getSession().getId();    }    @Autowired    @Qualifier("dataSources")    public void setDataSources(Map<String, DataSource> dataSources) {        setTargetDataSources(dataSources);}

我没有进行任何测试,因为设置不同的数据库需要大量工作,但我认为应该没问题。在现实世界中,每个会话不会有不同的数据源,而每个用户会有一个数据源,每个用户都有会话计数,但是正如我所说的,这是一个过于简化的示例。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370095.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号