1.故障现象

在平台中更改数据源的时候,会导致CommonDao 查询时数据源报连接关闭的问题。

2.原因分析

在更改数据源的时候,我们会将之前的数据源关闭并销毁掉,但是CommonDao 他会将SqlSessionTemplate 对象进行缓存,这样在查询的时候,实际还是用的之前的数据源。

3.解决办法

  1. 在数据源变更时,发布一个事件,这个事件带上当前的数据源别名。
  2. CommonDao 监听这个事件,当数据源变化时,将这个数据源key 放到 变更的 集合(dataSourceKey)中。
  3. 在执行查询时,如果发现当前的数据源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