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

我是付刚 2015-09-10 05:06:13
加精
在开发过程中如果修改了
*Mapper.xml的话就得重启一次
有没有方法能够实现不用重启的?
谢谢各位
...全文
20636 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
响亮的ITdog 2016-11-19
  • 打赏
  • 举报
回复
看了看大家的回复,发现大家都没get到要点,我最近也在做mybatis的热部署,发现很多mapper都放到了jar包里边,mapper文件是可以自动打包的(idea是可以的,eclipse不知道)现在的难点在于如何监控到jar包里的mapper文件变化,只能监控到jar包变化了,总不能监控的jar包变化重新加载所有mapper文件吧,这样热部署就没有意义了
FlyStoneZ 2016-01-12
  • 打赏
  • 举报
回复
jreble linksource
我是付刚 2015-09-21
  • 打赏
  • 举报
回复
引用 15 楼 starlight_118 的回复:
mybatis不允许热部署,在部署时是会验证XML的正确性的,如果你的XML有问题,系统是无法启动的,热部署时,如果你的XML有问题,是否直接给你挂掉?
有道理
我是付刚 2015-09-21
  • 打赏
  • 举报
回复
引用 8 楼 suciver 的回复:
要想做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()就可以了
有点高深,我先把贴结了 谢谢大神
bigzerg1014 2015-09-16
  • 打赏
  • 举报
回复
8楼大神,学习了!
大鹏118 2015-09-15
  • 打赏
  • 举报
回复
mybatis不允许热部署,在部署时是会验证XML的正确性的,如果你的XML有问题,系统是无法启动的,热部署时,如果你的XML有问题,是否直接给你挂掉?
伊顺鸣 2015-09-14
  • 打赏
  • 举报
回复
是这样的啊。。。。。。。。
yilan5 2015-09-14
  • 打赏
  • 举报
回复
谢谢楼主分享。来支持你了
我叫小菜菜 2015-09-13
  • 打赏
  • 举报
回复
我觉得,如果不是动辄几千万上亿的或者啥关键性项目,各位还是手动启动吧。简单粗暴。
shouxuan32 2015-09-13
  • 打赏
  • 举报
回复
不错的啊啊、、、、、、、
guichen68 2015-09-11
  • 打赏
  • 举报
回复
谢谢楼主分享。来支持你了
suciver 2015-09-11
  • 打赏
  • 举报
回复 1
要想做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()就可以了
qq_31226273 2015-09-11
  • 打赏
  • 举报
回复
学习了!!!
引用 7 楼 shijing266 的回复:
[quote=引用 5 楼 a116475939 的回复:] 第一个问题的关键不是说修改了jar包中的mapper文件无法热部署, 而是在于我改了其他的mapper后 会把sqlsessionfactory所有的sql给清空 然后再次加载时会漏掉jar包中的
我现在用的也是mybatis,之前也考虑过热部署的问题,一直没时间研究,给你推荐,顺便我也学习下[/quote]
  • 打赏
  • 举报
回复
引用 5 楼 a116475939 的回复:
第一个问题的关键不是说修改了jar包中的mapper文件无法热部署, 而是在于我改了其他的mapper后 会把sqlsessionfactory所有的sql给清空 然后再次加载时会漏掉jar包中的
我现在用的也是mybatis,之前也考虑过热部署的问题,一直没时间研究,给你推荐,顺便我也学习下
我是付刚 2015-09-10
  • 打赏
  • 举报
回复
求指教 谢谢各位
我是付刚 2015-09-10
  • 打赏
  • 举报
回复
引用 4 楼 shijing266 的回复:
[quote=引用 3 楼 a116475939 的回复:] 感谢回复, 这个我试过了, 我这个有点不太一样的地方, 有两个问题, 1,我这边的mapper文件有一部分是在jar包里面 ,所有用通配符的话找不到所有的jar包。(我该如何配置,能使用手工写所有的mapper) 2,这个类推荐的是使用定时任务,如果需要手动执行该怎么调用?
1、mapper文件在jar里面的话怎么热部署? 难道还自动打包? 2、不清楚,等待大牛处理吧,我顺便也学习[/quote] 第一个问题的关键不是说修改了jar包中的mapper文件无法热部署, 而是在于我改了其他的mapper后 会把sqlsessionfactory所有的sql给清空 然后再次加载时会漏掉jar包中的
  • 打赏
  • 举报
回复
引用 3 楼 a116475939 的回复:
感谢回复, 这个我试过了, 我这个有点不太一样的地方, 有两个问题, 1,我这边的mapper文件有一部分是在jar包里面 ,所有用通配符的话找不到所有的jar包。(我该如何配置,能使用手工写所有的mapper) 2,这个类推荐的是使用定时任务,如果需要手动执行该怎么调用?
1、mapper文件在jar里面的话怎么热部署? 难道还自动打包? 2、不清楚,等待大牛处理吧,我顺便也学习
我是付刚 2015-09-10
  • 打赏
  • 举报
回复
引用 1 楼 shijing266 的回复:
看看吧,我也没试过,也是手动启动的
感谢回复, 这个我试过了, 我这个有点不太一样的地方, 有两个问题, 1,我这边的mapper文件有一部分是在jar包里面 ,所有用通配符的话找不到所有的jar包。(我该如何配置,能使用手工写所有的mapper) 2,这个类推荐的是使用定时任务,如果需要手动执行该怎么调用?
  • 打赏
  • 举报
回复
加载更多回复(1)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧