`

难经5:当IBatis、Hibernate混合事务时,注意你的SQL

阅读更多

【问题】

现在,在开发所谓多层JavaEE应用时,数据持久层总是不可或缺的,而“全自动型”的ORM--Hibernate,和“全手动型”的SqlMap--IBatis,就相当于是数据持久层的哥俩好。这兄弟俩各有优势,也各有缺点,总体来说,Hibernate很好很强大,但细节多,学习曲线陡峭;而IBatis很快很简单,但不能跨数据库,要自己写很多SQL,包括分页等。因此,在不少项目里,我们同时使用了这两个组件,并使用Spring来统一管理事务。

 

最近参与的一个项目,就是使用了这种方式,但是却遇到了一个意向不到的问题:有一个包含IBatisDAO和HibernateDAO操作的Service方法,执行过程中总是抛空指针异常;而且,这个异常只在Sybase数据库上测试时抛出,而用MySQL则没有问题;更奇怪的是,单独测试IBatisDAO和HibernateDAO时,不论什么数据库,均没有问题;

 

【探幽】

空指针异常抛出的位置,是在用Hibernate执行一个P对象的查询后,再查询P懒加载的一个关联对象集后抛出的。

 

反应一:这个问题,让我想到了之前碰到过的一个Sybase的问题(见难经一:http://liuu.iteye.com/admin/blogs/288660),难道又是Sybase跟Hibernate有什么不兼容?但是,由于单独测试DAO都没有问题,我否定了这个可能。

 

反应二: 是不是IBatis和Hibernate的事务混和出的问题?但是只在Sybase下碰到,就很奇怪了(没办法,这是项目的生产环境),该死的Sybase到底在闹什么别扭呢。

 

IBatis和Hibernate的混合使用,其实配置起来比较简单,网上也有很多示例,大致如下三步:只要在Spring中公用一个数据源,并配置使用同一个DataSource事务管理器,再配置允许Hibernate和IBatis使用外部的事务管理即可。再次检查这些配置,也没有看出什么异常来,而空指针异常也每次顽固的抛出,绝对重现......

 

打开Hibernate的SQL日志,我在出异常的地方反复调试,看看执行的SQL到底有什么问题:

1、执行对象P的操作查询,OK

2、执行对象P的关联集合属性(包括对象M和C)的查询,OK

3、使用对象M,OK

4、使用C对象是,却发现C依然是null,FAILED

 

问题出现在4,C对象查询后居然为空,难道2查询结果不对?

于是,我将2执行的SQL拷出来用直接连接数据库执行,却发现查询结果正常!

 

问题到底在哪?

 

我郁闷的回过头来再看日志,突然发现,2查询返回的结果只有一条记录!不对啊,刚才查询是有两条的啊,一条对应对象M,另一条对应对象C,如果只返回一条,那么C对象肯定为空了!

 

呼呼,空指针异常的原因找到了,但是,新的问题又来了,为什么Hibernate执行查询2时,只返回一条记录呢。归纳一下现在的情况:

1、这个问题只在Sybase下出现,其他数据库正常

2、HibernateDAO和IBatisDAO单独执行都没有问题

3、在执行Hibernate查询之前,执行过IBatis的SQL

4、事务边界划在Service的方法上,因此,Hibernate和IBatis执行的所有操作,都在同一个连接的同一个事务里

 

结合这四条,我的头脑映出了一条Sybase专用的限制结果集语句:“set rowcount 1”,对,应该就是它,它会限制当前连接的所有查询都只返回不多于一条的记录,而其他的数据库如MySQL之limit、Oracle之rownum、MSSQL之top(Sybase的新版本也支持top),都只对当前查询SQL有效,没有副作用。

 

可以肯定,在Sybase下,在做这个Hibernate查询之前,在执行的某个IBatis的SQL查询操作中,使用了set rowcount 1,却没有在查询后改回 rowcount的设置,从而导致后续的查询结果集都是1条,从而导致了后面的C对象为null的异常。

 

【解难】

当把问题的焦点从抛异常的HibernateDAO处,移到Service类执行该操作之前的其他IBatisDAO的操作时,通过一一排查时,很快在IBatisDAO的Sybase实现版本的某个映射配置文件中,找到了罪魁祸首:那条“set rowcount 1”语句,而在select之后,确实没有“set rowcount 0”来将rowcount复原。

 

在那条select语句后面,加上 “set rowcount 0”,再次测试Service,OK,JUnit绿条通过!!

 

【小结】

回头来看,这次碰到的看似一个小问题,找起来却费了大麻烦,归结起来有如下原因:

1、错误游离和假相:IBatis中SQL编写的错误,却在Hibernate实现的DAO中才引起异常,导致总是认为错误在后者,而想不到前者。

2、缺乏沟通和代码检查:由于一部分人用IBatis开发,一部分人用Hibernate开发,两边都不了解两个部分之于整体的关系,而单独的DAO测试,却检验不出这类问题来,因而在集成时难以真正定位问题

 

总之一句话,如果使用IBatis开发,不管有没有混合使用Hibernate,一定要注意SQL本身的检查,包括当前连接属性的设置和恢复,以及不同数据库之间的差异。

5
0
分享到:
评论

相关推荐

    难经3:Struts2,拦截器拦不住Result?

    3. **异常处理**:当Action执行抛出异常时,Struts2默认会跳过剩余的拦截器并执行相应的异常Result。如果拦截器处理不当,可能会导致预期的Result无法执行。 4. **ActionInvocation**:`ActionInvocation`是Struts2...

    先秦至三国时期的医学文献.docx

    这段时期的医学主要体现在马王堆汉墓出土的医书以及《内经》、《难经》等经典著作中。以下是对这些文献中相关知识点的详细阐述: 1. 马王堆汉墓医书:在马王堆出土的《足臂十一脉灸经》和《十一脉灸经》中,首次...

    2019年安徽屯溪区个体经济发展服务中心招聘模拟试题及答案解析.docx

    2. 硅胶干燥剂:硅胶干燥剂是一种常用的吸湿材料,当其吸收到水分后,会发生颜色变化,通常会从蓝色变为粉红色,以指示吸湿程度。 3. 刑罚与犯罪的关系:犯罪是刑罚的前提,没有犯罪就不存在适用刑罚的必要。刑罚是...

    中医研修会10月份工作计划.doc

    4. 每月最后一周周五下午2:00-5:00:学术研讨会 六、资源支持 1. 阅读材料:提供电子版和纸质版的经典书籍供会员参考。 2. 学习平台:建立在线学习社区,发布资料、视频教程和讨论话题。 3. 专家指导:邀请资深中医...

    主治医师 (中医全科学)-肺系病证(A1型题 2).doc

    《难经》:未明确提出肺痈。 - C. 《金匮要略》:正确选项。“肺痈”病名首见于此书。 - D. 《伤寒论》:未明确提出肺痈。 - E. 《诸病源候论》:对多种疾病病因进行了论述。 **答案**:C. 《金匮要略》 #### ...

    2022年中医执业医师考试复习资料完全版归纳.docx

    5. **病理因素**:内伤咳嗽的基本病理因素是痰和火(注意与脏腑失调病因的区别)。 ### 三、哮与喘 1. **哮的定义**:始见于《丹溪心法》,提出“哮喘专主于痰”。 2. **病机特征**:哮病的病机特征是宿痰伏肺(夙...

    刺法灸法学考试重点(非常全面).doc

    5. **非艾火类灸法**:如天灸,不使用艾叶,而是通过贴敷药物来刺激穴位。 6. **《经》**:是一部全面总结上古以来刺法与补泻手法的书籍,对针灸技术的发展有重要影响。 7. **行针基本手法**:捻转法是最常见的...

    南通大学2019年招聘模拟试题及答案解析.docx

    当劳动合同订立时所依据的客观情况发生重大变化,导致合同无法履行时,用人单位需与劳动者协商变更合同,若双方无法达成一致,用人单位可解除劳动合同,但需提前三十日以书面形式通知劳动者或额外支付一个月工资。...

    [医学类考试密押题库与答案解析]河南省医疗卫生系统招聘考试中医学专业知识2012年真题.docx

    11. **有毒中药**:刺蒺藜含有小毒,使用时需要注意。 12. **丸剂特点**:糊丸具有较强的黏合力,溶散慢,能延长药效并减轻药物对胃肠的刺激。 13. **方剂应用**:芍药汤适用于湿热痢疾,能调气和血,清热燥湿,...

    2016年上半年浙江省医疗卫生招聘公共基础知识考试题.pdf

    1. 维生素 D 缺乏与健康:维生素 D 缺乏会导致佝偻病,这是由于维生素 D 对钙、磷代谢的调节作用,缺乏时影响骨骼的正常发育。 2. 支气管扩张症的治疗:主要治疗手段是保持呼吸道通畅和控制感染,防止病情恶化。 3...

    精品资料(2021-2022年收藏)浙江省医疗卫生招聘公共基础知识考试试题.docx

    5. 医患关系模式:切除阑尾手术后的病人通常适用于指导-合作型,医生指导,病人配合。 6. 白喉的特征:伪膜坚韧,不易剥离,重剥则出血,或剥去随即复生,这是白喉的典型表现。 7. 急性胆囊炎的识别:剧烈绞痛,右...

    2019浙江卫视招聘综艺、采编、营销等专业人员试题及答案解析.docx

    5. 职业道德规范:职业道德要求员工在工作中保持专业性,不应在工作时间从事与工作无关的活动,如在单位电脑上看小说,使用单位电话聊天,或侵犯他人隐私如打开同事的电子邮箱。 6. 环境污染与法律责任:根据案例,...

    胡希恕金匮要略讲座.docx

    7. 《难经》的理论借鉴:治疗思路受到《难经》的影响,如“西方实、东方虚,补南方、泻北方”的原则,通过调整心火和肾水的关系,以达到治疗目的。 这些知识点展示了中医临床诊疗的独特观念和方法,强调了整体观念...

    中西医结合执业助理医师-肝系病证(精选试题).doc

    3. **医籍记载**:最早明确指出胁痛与肝胆病变相关的医籍是《难经》,这是中国古代医学的重要文献之一,对后世医学发展有着深远影响。 4. **瘀血阻络胁痛**:瘀血阻络是指血液运行不畅,形成瘀血阻碍经络,表现为胁...

    中医类考试复习资料 大学期末考 中医类大学

    2. **中药学**:中药是中医治疗疾病的主要手段,涉及药物的来源、性味归经、功效、用法及注意事项。学生需要掌握常用中药的药性和配伍禁忌。 3. **方剂学**:学习经典方剂的组成、功效、适应症,以及如何根据病情...

    2019浙江余杭区仁和街道招聘巡防队员试题及答案解析.docx

    ### 5. 商品的自然属性 - **使用价值**:指商品能满足人们特定需求的能力,是商品的自然属性。 ### 6. 现代通信技术 - **GPS系统**:由24颗人造卫星组成的全球定位系统,用于导航和定位服务。 ### 7. 文学作品...

    中医基础理论练习总习题.doc

    5. **中医学经典著作**:如《黄帝内经》是中医学理论的基石,它包含了中医的基础理论、病因病机、养生保健等内容。其他重要著作包括《难经》、《伤寒杂病论》等。 6. **中医学理论体系形成的标志**:《黄帝内经》的...

    中医诊断学复习要点.doc

    - 了解中医诊断学在历史上的发展,包括代表性的医家和他们的著作,如《难经》、《伤寒杂病论》等。 6. **具体内容**: - 问诊:包括问寒热、问汗、问疼痛、问头身胸腹、问耳目、问睡眠、问饮食口味、问二便、问经...

    《中医学基础》试题及参考答案(中医学本科).doc

    5. 肺的功能:肺在中医中主要负责气的调节,包括司呼吸、通调水道、主治节。肺主升清,但不直接与“升清”对应,这通常指的是脾的功能。 6. 脾统血:脾在中医中具有统摄血液在经脉中运行的作用,防止出血或血液溢出...

Global site tag (gtag.js) - Google Analytics