有人反馈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,一个代理类