Code Bye

mybatis修改mapper文件后需要重启(mybatis热部署)

开发过程中假设修改了

*Mapper.xml的话就得重启

有没有方法能够实现不用重启的?

解决方案:50分

要想做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()就可以了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mybatis修改mapper文件后需要重启(mybatis热部署)