当前位置: 代码迷 >> J2EE >> 关于mybatis修改地图per文件后需要重启的有关问题(mybatis热部署)
  详细解决方案

关于mybatis修改地图per文件后需要重启的有关问题(mybatis热部署)

热度:72   发布时间:2016-04-17 23:04:53.0
关于mybatis修改mapper文件后需要重启的问题(mybatis热部署)
在开发过程中如果修改了
*Mapper.xml的话就得重启一次
有没有方法能够实现不用重启的?
谢谢各位
------解决思路----------------------
要想做mybatis的热部署,你要对mybatis的源码做些改造,所有mapper解析都是利用mybatis的XMLMapperBuilder.parse()解析的,他都放在mybatis的Configuration中,Configuration源码中用到的protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
  protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
  protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
  protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");
  protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection");
这几个都是用来放mapper解析后的MappedStatement就是sql(insert,delete,update,select)的节点,ResultMap配置的ResultMap
ParameterMap配置的ParameterMap包括keyGenerators在save时所用的主键生成器.因为他们用的StrictMap都是不可变的,即内部在put的时候会判断原先是否存在存在就抛出异常,这个StrictMap我们可以用ConcurrentHashMap,因为要重新解析放入Configuration用并发的HashMap防止你在重新解析放入Configuration时,其它地方要调用就需等待了就是读写锁了,因为mybatis要执行所有的statementId所用的sql时都要调用Configuration.getMappedStatement(String statementId)都是从这个mappedStatements里面get出来的.改造了这个后,热部署就简单了,可以用quartz也可以用apache提供的commons-io包中对文件的监听,只要发现发生变化就可以用XMLMapperBuilder.parse()就可以了
  相关解决方案