mybatis不允许热部署,在部署时是会验证XML的正确性的,如果你的XML有问题,系统是无法启动的,热部署时,如果你的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()就可以了
[quote=引用 5 楼 a116475939 的回复:] 第一个问题的关键不是说修改了jar包中的mapper文件无法热部署, 而是在于我改了其他的mapper后 会把sqlsessionfactory所有的sql给清空 然后再次加载时会漏掉jar包中的
第一个问题的关键不是说修改了jar包中的mapper文件无法热部署, 而是在于我改了其他的mapper后 会把sqlsessionfactory所有的sql给清空 然后再次加载时会漏掉jar包中的
[quote=引用 3 楼 a116475939 的回复:] 感谢回复, 这个我试过了, 我这个有点不太一样的地方, 有两个问题, 1,我这边的mapper文件有一部分是在jar包里面 ,所有用通配符的话找不到所有的jar包。(我该如何配置,能使用手工写所有的mapper) 2,这个类推荐的是使用定时任务,如果需要手动执行该怎么调用?
感谢回复, 这个我试过了, 我这个有点不太一样的地方, 有两个问题, 1,我这边的mapper文件有一部分是在jar包里面 ,所有用通配符的话找不到所有的jar包。(我该如何配置,能使用手工写所有的mapper) 2,这个类推荐的是使用定时任务,如果需要手动执行该怎么调用?
看看吧,我也没试过,也是手动启动的
67,512
社区成员
225,885
社区内容
加载中
试试用AI创作助手写篇文章吧