实现ibatis的动态加载sqlmap配置文件

 
有人反馈SqlMapParserFactory不可视,自己看看ibatis或者spring的源代码,具体是哪个忘记了,这个类不是public的,自己改成public的就可以了,欢迎访问chenwenxuan.com

原创文章,转帖请注明出处:

http://blog.csdn.net/palm_civet/archive/2010/11/07/5993613.aspx

 

 

ibatis在开发的时候每次修改都需要重启应用服务器,所以一直想做一下ibatis的动态加载,加快开发速度。这里是基于2.3.4.726版本做的。

 

网上搜了一下,发现这个需求看是蛮多的。但是ibatis一直没有提供相应的api,分析了下源代码,有以下几个原因:

 

1. 同步问题。

ibatis内部保存sql使用的hashMap,并没有使用java5中的新类。此外,在ibatis的解析代码中还发现ibatis中的解析器对于一个sqlMapClient是不变的,同时在解析的时候引用了一个表示状态的变量,这个变量在并发解析的时候会存在同步问题。

 

2. sql引用的问题。这个比较复杂,各种引用关系如何处理在ibatis中如何处理都没有涉及。

 

通过以上分析,可以看出ibatis的作者根本没有考虑过动态加载的问题。做一个完全动态的ibatis看来是比较困难的。做一个用于开发使用的ibatis,在开发环境上使用还是可行的。

 

实现的大体思路是:

 

当用户使用sqlMapClient调用方法访问数据库的时候判断一下相应的配置文件是否已经改变,如果已经改变,那么就重新解析一遍,并且加载到sqlMap中

 

公司的项目使用的是spring和ibatis,结合这几个情况,我们需要实现几个类,并使用反射替换ibatis中的一些实现,完成动态加载

 

1. 继承spring的SqlMapClientFactoryBean,加载sqlMap。

 

2. 继承ibatis中的SqlMapClientImpl,对用户的访问请求作控制。

 

3. 继承ibatis中的SqlMapExecutorDelegate,目的同上。

 

4. 继承ibatis中的SqlMapParser,目的同上。发现ibatis在判读重复的sql的逻辑没有写在一个地方,所以不得不实现这个类了。

 

具体实现:

 

DySqlMapClientFactoryBean.java,用于spring加载ibatis,大部分代码都是spring的

 

 

DySqlMapClient.java,一个代理类

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值