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

我是付刚 2015-09-10 05:06:13
加精
在开发过程中如果修改了
*Mapper.xml的话就得重启一次
有没有方法能够实现不用重启的?
谢谢各位
...全文
20652 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)
必备 官网: https://gitee.com/topfox/topfox 文中例子源码: https://gitee.com/topfox/topfox-sample TopFox技术交流群 QQ: 874732179 2.2. topfox 介绍 在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴 mybaties plus 部分思想 特性: 无侵入:只做增强不做改变,引入它不会对现有工程产生影响 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 集成Redis缓存: 自带Redis缓存功能, 支持多主键模式, 自定义redis-key. 实现对数据库的所有操作, 自动更新到Redis, 而不需要你自己写任何代码; 当然也可以针对某个表关闭. 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 支持主键自动生成:可自由配置,充分利用Redis提高性能, 完美解决主键问题. 支持多主键查询、修改等 内置分页实现:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 支持devtools/jrebel热部署 热加载 支持在不使用devtools/jrebel的情况下, 热加载 mybatismapper文件 内置全局、局部拦截插件:提供delete、update 自定义拦截功能 拥有预防Sql注入攻击功能 无缝支持spring cloud: 后续提供分布式调用的例子
请仔细阅读 README.md ## 1.1. 必备 - 文中涉及的例子源码网址: https://gitee.com/topfox/topfox-sample - TopFox技术交流群 QQ: 874732179 ## 1.2. topfox 介绍 在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴mybaties plus部分思想 特性: - **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响 - **损耗小**:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 - **集成Redis缓存**: 自带Redis缓存功能, 支持多主键模式, 自定义redis-key. 实现对数据库的所有操作, 自动更新到Redis, 而不需要你自己写任何代码; 当然也可以针对某个表关闭. - **强大的 CRUD 操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 - **支持 Lambda 形式调用**:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 - **支持主键自动生成**:可自由配置,充分利用Redis提高性能, 完美解决主键问题. 支持多主键查询、修改等 - **内置分页实现**:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 - **支持devtools/jrebel热部署** - **热加载** 支持在不使用devtools/jrebel的情况下, 热加载 mybatismapper文件 - 内置全局、局部拦截插件:提供delete、update 自定义拦截功能 - **拥有预防Sql注入攻击功能** - **无缝支持spring cloud**: 后续提供分布式调用的例子

67,513

社区成员

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

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