- 浏览: 124666 次
- 性别:
- 来自: 北京
最新评论
-
C_J:
有必要这么鸡冻咩?
编写自己的ClassLoader知识点 -
jason61719:
你这不是说了等于没说吗……就解析个loadClass(),谁不 ...
编写自己的ClassLoader知识点 -
jiming:
tedeyang 写道很好的改进,不过话说回来,mybatis ...
开源,从关注产品社区做起(ibatis3.x的最近一个issue展示) -
C_J:
独爱Java 写道好像实际用处并不是很大,只是多了解了有这个东 ...
Java内存模型笔记 -
独爱Java:
好像实际用处并不是很大,只是多了解了有这个东西而已。。。
Java内存模型笔记
不知道楼下的同学自己亲手验证过没有,帖子也竟然被投为"新手帖"
按照楼下同学说的,原来可以通过外围构造一个TransactionManager通过setTxManger()方法赋值过去....从而根本不需要更改ibatis的源码了...这个方法确实比原来的好..
String resource = "sql-map-config.xml"; Reader reader = Resources.getResourceAsReader (resource); SqlMapClientImpl sqlMap = (SqlMapClientImpl) SqlMapClientBuilder.buildSqlMapClient(reader); TransactionConfig transactionConfig = new ExternalTransactionConfig(); Properties properties = new Properties(); properties.setProperty("SetAutoCommitAllowed", "false"); transactionConfig.setDataSource(getDataSource()); transactionConfig.setProperties(properties); TransactionManager txManager = new TransactionManager(transactionConfig); sqlMap.getDelegate().setTxManager(txManager);
今天验证这个方案发现:
transactionConfig.setProperties(properties);
错误:The method setProperties(Properties) is undefined for the type TransactionConfig
以上方案修改如下:
把transactionConfig.setProperties(properties); 更改为transactionConfig.initialize(properties);
题记:
有时候在做项目的时候,Ds需要被其他应用监控,需要用到外部的DataSource,而不能用框架本身的DS..而修改IBATIS的XML配置文件也做不到,无奈今天只能更改源码了...
下面大概简单介绍下各种配置文件和源码.
ibatis的xml配置文件
类似很多dao框架一样, 这个配置有oscache配置,datasource数据库连接池配置,sqlMap映射文件配置,详细配置请看博客或者google吧,这里就不详述了..但重点说下datasource配置:ibatis2.3.0提供3类DS,分别为SIMPLE,DBCP,JNDI..配置方法大同小异.. 配置好后,这样在ibatis初始化的时候就会建立相应的ds和连接池了.
问题所在
1,ibatis可以读取任意一个xml文件,但xml的格式是规定死的..如配置文件必须以 打头等等.
2,xml配置可兼容jndi规范,但是有时候项目中并没有写成jndi,而是以另一种xml配置文件存在.
3,项目中需要用到其他ds,不允许新创建.
解决方案
基于以上的状况,我没有找到更好的解决方案,所以只能更改源码,思路是ibatis不构建自己的ds对象,而是公用其他模块的ds对象,思路很明确,所以代码也好改,原ibatis配置文件不配置ds,外部ds对象作为参数传入ibatis..
具体方法
总共修改2个类,主要是改下参数和赋值了ds对象而已,也没有仔细研究过源码,有不对的地方还请海涵``
//修改SqlMapClientBuilder.java /** 新增方法,把外部的ds传进去**/ /** * add ds parameter by cj.yangjun@gmail.com * @param reader * @param ds * @param forceCommit * @return */ public static SqlMapClient buildSqlMapClient(Reader reader,DataSource ds,boolean forceCommit) { // return new XmlSqlMapClientBuilder().buildSqlMap(reader); return new SqlMapConfigParser().parse(reader,ds,forceCommit); } //修改SqlMapConfigParser.java /**parser是一个NodeletParser 类,The NodeletParser is a callback based parser similar to SAX. vars是作者构建的Variables,这里有个疑问**/ public SqlMapClient parse(Reader reader) { try { if (vars.sqlMapConfigConv != null) { System.out.println("null"); reader = vars.sqlMapConfigConv.convertXml(reader); } usingStreams = false; parser.parse(reader); return vars.client; } catch (Exception e) { throw new RuntimeException("Error occurred. Cause: " + e, e); } } /**新增方法,把外围ds传进入,并且赋值**/ public SqlMapClient parse(Reader reader,DataSource ds,boolean forceCommit){ vars.dataSource=ds; vars.errorCtx.setActivity("configuring the transaction manager"); String type = "jdbc"; type = vars.typeHandlerFactory.resolveAlias(type); TransactionManager txManager = null;//ibatis的思路是要构造一个TransactionManager 对象 try { vars.errorCtx.setMoreInfo("Check the transaction manager type or class."); TransactionConfig config = (TransactionConfig) Resources.instantiate(type);//需要构造一个JDBC类型TransactionConfig我们的ds等部分信息去填充这个TransactionConfig,JDBC的其他属性由这个config初始化 config.setDataSource(vars.dataSource); config.setMaximumConcurrentTransactions(vars.client.getDelegate().getMaxTransactions()); vars.errorCtx.setMoreInfo("Check the transactio nmanager properties or configuration."); config.initialize(vars.txProps); vars.errorCtx.setMoreInfo(null); txManager = new TransactionManager(config); txManager.setForceCommit(forceCommit); } catch (Exception e) { if (e instanceof SqlMapException) { throw (SqlMapException) e; } else { throw new SqlMapException("Error initializing TransactionManager. Could not instantiate TransactionConfig. Cause: " + e, e); } } vars.client.getDelegate().setTxManager(txManager);// 根据这个manager初始化一些事务控制的对象 return parse(reader);//parser是一个NodeletParser ,The NodeletParser is a callback based parser similar to SAX. 读取其他内容并初始化... }
修改过,简单测试下,应该是可以用的..
疑问
在看的过程对有个地方有个疑问:
有如下结构关系:
public class SqlMapConfigParser extends BaseParser{
...
}
public abstract class BaseParser {
protected final Variables vars;
protected static class Variables {
public ExtendedSqlMapClient client;
public SqlMapExecutorDelegate delegate;
public TypeHandlerFactory typeHandlerFactory;
public DataSource dataSource;
......
}
}
其中Variables 的注释如下:
/**
* Variables the parser uses. This "struct" like class is necessary because
* anonymous inner classes do not have access to non-final member fields of the parent class.
* This way, we can make the Variables instance final, and use all of its public fields as
* variables for parsing state.
*/
我不明白作者精心设计这个"struct"的目的是什么呢?没看明白这里的because
* anonymous inner classes do not have access to non-final member fields of the parent class.
评论
现在啥年代了,没有spring的项目多得是,自己去看看吧!
楼上的说"新手帖",想必你应该都明白吧? 那能否能帮我解答呢?
其他模块构造的任意一个Ds对象...
发表评论
-
iOS入门(ongoing)
2012-09-13 11:32 1238Record it: The overview of ... -
Stuff about Android
2011-07-09 16:15 1025Foreword: long time ... -
JQuery初体验(Demo)
2011-05-22 13:43 1400Demo:Show <meta content ... -
Java内存模型笔记
2011-04-13 15:48 1501题记: 看到C/C++ ... -
Radiant_The Popular Ruby's CMS Demo篇
2011-04-02 14:49 1190题记: 上篇 记录我第一次安装Rodiant经过和 ... -
Radiant_The Popular Ruby’s CMS安装篇
2011-03-28 00:48 1230题记: 今天第一次参加JE的线下活动,robbin等 ... -
关于Azul 并发垃圾回收器
2011-03-26 14:40 1271题记: 总感觉JE讨论的帖子的东西都比较滞后,所以会 ... -
phpCMS & jQuery是我该做的(阉割了)
2011-02-27 23:02 81WD讲究以plugin挂载为结构,我需要构造一个p ... -
我的玩意:J2ME的Criteria初探
2011-01-20 21:59 975题记: 前几天跟初中同学聊天,他问我能不能做一个GP ... -
编写自己的ClassLoader知识点
2011-01-13 14:41 1835题记: 看到InfoQ关于ClassLoader的文 ... -
周末好玩,用短信控制你的计算机
2011-01-10 16:34 2898Snapshot: 详情 ... -
About Dock Plugin on Mac
2010-11-21 22:47 1426题记: 第一次接触MAC的开发..... ... -
可变hashcode的隐患和序列化安全
2010-10-25 00:55 1287可变hashcode的隐患 为识别对象,JDK ... -
体验OSGi(helloworld.jar)—富app的热拔插
2010-10-18 23:22 2373记得以前工作的时候,有天direct manager问 ... -
MongoDB on DAO with Java Language
2010-08-26 19:17 1394A Quick Tour Using the Java d ... -
Getting Start on Mongodb
2010-08-26 01:29 1446题记: 最近老和同学聊到non-relational ... -
Java Media Framework本地玩转摄像头
2010-08-04 00:57 16871、简介The JavaTM Media Framework ... -
从WeakLogHandler应用看Java的引用、引用队列
2010-06-14 00:58 1465题记: 前几天讨论到WeakHashMap(这个是个弱引用的 ... -
《重构》读书笔记
2010-05-09 00:05 1001Martin Fowler于2003年出版 ... -
RPC之WebServices&RMI&JMS,phprpc框架?(待续)
2010-05-06 22:31 55前段时间写过基本的WebServices,也没再做深入 ...
相关推荐
ibatis的原码 ibatis源码 ibatis源码 ibatis源码
ibatis框架源码剖析书中附带的光盘,ibatis源码分析
iBATIS框架源码剖析源码 iBATIS框架源码剖析源码 iBATIS框架源码剖析源码
ibatis源码 学习参考 对于学习ibatis很有帮助
iBATIS框架源码剖析
通过修改ibatis源码实现sql分页。由于ibatis默认分页是全部查出,然后再从中取出相应的数据实现分页,效率底。所以需要扩展
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。
mybatis的前身ibatis源码剖析
NULL 博文链接:https://jsufly.iteye.com/blog/508249
springmvc+ibatis写的开发源码,对学习springmvc+ibatis的框架搭建和配置有帮助,下载后能够在eclipse中运行。
介绍Ibatis框架中需要同时连接多个资料库的方法,包括.net和Java两种
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data ...
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" ... <dataSource type="SIMPLE"> </dataSource> </sqlMapConfig>
ibatis 框架源码剖析 书籍源代码 带有详尽注释 .这个是我买的书,其实书的内容简单,大部分的内容都在源代码注释中
ibatisDemo 入门源码
ibatis 2.3.4 的源码 public abstract Object insert(String paramString, Object paramObject) throws SQLException; public abstract Object insert(String paramString) throws SQLException; public ...
apache开源项目源码ibatis-3-core-src-3.0.0.227 ibatis框架java源程序 spring,struts,hibernate,ibatis,框架源码 各种ibatis框架应用源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其...