1.故障现象
在平台中更改数据源的时候,会导致CommonDao 查询时数据源报连接关闭的问题。
2.原因分析
在更改数据源的时候,我们会将之前的数据源关闭并销毁掉,但是CommonDao 他会将SqlSessionTemplate 对象进行缓存,这样在查询的时候,实际还是用的之前的数据源。
3.解决办法
- 在数据源变更时,发布一个事件,这个事件带上当前的数据源别名。
- CommonDao 监听这个事件,当数据源变化时,将这个数据源key 放到 变更的 集合(dataSourceKey)中。
- 在执行查询时,如果发现当前的数据源key在变更的集合中,就重建 SqlSessionTemplate 并缓存,同时从变更集合中删除改 数据源key。
4. 实现代码
4.1 发布变更事件
//发布事件。
DataSourceUpdEvent updEvent=new DataSourceUpdEvent(key);
SpringUtil.publishEvent(updEvent);
4.2 CommonDao进行监听
public class CommonDao implements ApplicationListener<DataSourceUpdEvent>{
@Override
public void onApplicationEvent(DataSourceUpdEvent dataSourceUpdEvent) {
String key=(String)dataSourceUpdEvent.getSource();
dataSourceKey.add(key);
}
}
4.3 重建数据源
//当数据源发生变化时,重建SqlSessionTemplate对象。
if(dataSourceKey.contains(alias)){
SqlSessionTemplate sessionTemplate=buildTemplate(alias);
sessionTemplateMap.put(alias,sessionTemplate);
dataSourceKey.remove(alias);
return sessionTemplate;
}
文档更新时间: 2021-08-03 11:25 作者:zyg