`

难经1:Sybase和Hibernate不对付?

阅读更多

[问题] 一直在使用Hibernate提供的通用分页机制,在通过查询api设置分页后,执行查询一直正常。突一日,使用包装了这部分的分页组件的W君,报告分页查询时,抛出奇怪异常,数据库是Sybase:

09:26:24,265 [main] ERROR JDBCExceptionReporter : JZ0BT: 类型 TYPE_FORWARD_ONLY 的 ResultSets 不支持 absolute(int) 方法。
org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query
Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.loader.Loader.doList(Loader.java:2214)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
	at org.hibernate.loader.Loader.list(Loader.java:2090)
	at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
	at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
	at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
	at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
Caused by: java.sql.SQLException: JZ0BT: 类型 TYPE_FORWARD_ONLY 的 ResultSets 不支持 absolute(int) 方法。
 at com.sybase.jdbc3.jdbc.ErrorMessage.raiseError(ErrorMessage.java:515)
 at com.sybase.jdbc3.jdbc.SybResultSet.checkForScrollability(SybResultSet.java:1757)
 at com.sybase.jdbc3.jdbc.SybResultSet.absolute(SybResultSet.java:717)
 at org.apache.commons.dbcp.DelegatingResultSet.absolute(DelegatingResultSet.java:334)
 at org.hibernate.loader.Loader.advance(Loader.java:1469)
 at org.hibernate.loader.Loader.getResultSet(Loader.java:1783)
 at org.hibernate.loader.Loader.doQuery(Loader.java:662)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 at org.hibernate.loader.Loader.doList(Loader.java:2211)

 [探幽]

从异常看,第一反应,好像是查询时未设置游标类型,导致不支持调用absolute调用。这不是一个老生长谈的问题么,难道Hibernate在建立连接时,未设置相应属性?但不可能啊,Hibernate的分页查询要有这么大的BUG,也不用等我来发现了。在查看Hibernate的代码后,也看到它明确设置了游标类型;

第二反应,Sybase驱动或Sybase版本问题?之前在jconn2、jconn3驱动上做过单元测试,没有问题,为了确认,再跑了几次,没有问题。还有,报出问题的Sybase版本与测试的Sybase版本基本一致,只有小版本差异,应该不会有多大问题。所以,也不太可能;

第三反应,算了先不想了,Google吧,也许人家是早就搞定过的问题了。于是填入多个搜索词+Sybase的错误码->GO,奇怪,确实有两个提问这个的,csdn上一个,hibernate论坛上一个,一看都是05年的了,而且代码设置分页的代码和我一模一样,看看回答,结果不多,全看下来,大概都是和我第一反应和第二反应相同的思路,而后续竟淹没无解了......

难道。。。难道Sybase真和Hibernate不对付,偶尔不爽了就发个飚,摆上一道?否则怎么没碰到其他数据库报这个问题?

 

[解难]

歇了一晚,回头再想想,觉得不甘心,又总觉得哪有不妥,记得原来在调用Hibernate的api,设置firstResult时,是直接通过页数,算出第一行记录的:

query.setFirstResult((pq.getPageIndex()-1) * pq.getPageRows());

 

这和Hibernate论坛上提问的那位代码一致,当初在通过页码计算首记录位置时,曾闪过:如果计算得到负数,Hibernate会报错么。基于MySQL的测试表明,Hibernate好像是把负数忽略了,变成从0开始,后来在Sybase上的测试,分页数都是正确的,没有再试过负页数。现在据说报错也是偶然发生,那是不是有可能:在偶然输入错误的分页数时,负分页数直接传到了后台给hibernate,然后sybase在接受这个负参数时报出异常;而其他时候又运行正常。

想到这,我眼睛一亮:),立即掏出Eclipse,祭出JUnit,在原来的测试上加上负页数的输入断言,然后选择在Sybase上运行...... 整个世界清静了,W君报告的偶发错误终于重现——JZ0BT。由亮而暗,我的眼里透出了一丝苦涩,唉,又是一个低级错误啊,当初要不是太相信Hibernate,多加上输入参数校验,也不会搞出这一档子事啊!

2
0
分享到:
评论

相关推荐

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

    标题中的“难经3:Struts2,拦截器拦不住Result?”揭示了这是一个关于Struts2框架中拦截器(Interceptor)与结果(Result)交互问题的讨论。在Struts2框架中,拦截器是实现业务逻辑和控制逻辑之间解耦的重要机制,而...

    聿修堂医学选 素问识 素问绍识 灵枢识 难经疏证.pdf

    由于中医理论体系庞大,学术流派众多,这套书籍的研究和使用,对于对中医基础理论有深入兴趣的研究者和临床医生来说,都是不可或缺的宝贵资料。它不仅可以帮助读者深化对中医学经典的认识,而且对于提升临床治疗效果...

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

    1. 行政强制法:根据《行政强制法》的规定,行政强制措施只能由法律设定,法规、规章以及其他规范性文件无权设定。这意味着行政强制执行的权力和程序应当受到严格的法律限制。 2. 硅胶干燥剂:硅胶干燥剂是一种常用...

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

    1. 提升会员对《黄帝内经》、《难经》、《伤寒杂病论》等中医经典的理论认识。 2. 强化实践技能,通过临床案例解析,提高会员的诊疗水平。 3. 增进会员间的学术交流,促进中医理论的创新与实践。 三、活动内容 1. ...

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

    13. 脉学论述:《难经》对脉学有较详细的论述和创见。 14. 长针进针法:夹持进针法通常适用于长针的进针。 15. 血友病的病因:先天凝血因子缺乏导致出血倾向。 16. 泄泻湿热伤中证的治法:消食导滞,用于腹泻伴有...

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

    心和肺:不符合喘证的主要发病机理。 - B. 肝和脾:与喘证发病关系较小。 - C. 肺和脾:虽涉及肺脏但未涵盖肾脏在喘证中的作用。 - D. 肺和肾:正确选项。喘证主要由肺失宣降、肾不纳气所致,体现了肺主气、肾纳...

    中医执业医师考试重点版.doc

    感冒的病机主要为肺气失宣和卫表不和,与咳嗽的区别在于是否有表证。 2. 咳嗽:咳嗽的中医概念早见于《经》,而《素问·咳论》指出五脏六腑皆可引起咳嗽,不仅限于肺。咳嗽分为外感和内伤,病理因素包括痰和火。它...

    准确辨别浮脉和沉脉.doc

    《难经》首次提出的"持脉轻重法"是一种精确鉴别浮脉和沉脉的诊脉技术。该方法通过在寸、关、尺三部布指,然后逐渐加压,直至脉搏无法感知,即"按之至骨",再根据脉位的深浅和所用的指力来判断脉象。这一过程包括三个...

    健康养生演讲稿.doc

    而过度忧虑、思虑会伤脾,可能导致脾胃不和。 2. **不健康生活习惯**: - **饮食不规律**:暴饮暴食、胡吃海塞会伤脾,可能导致胃病和糖尿病。 - **缺乏运动**:运动不足会使湿气积聚,影响身体机能。适当的运动...

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

    【知识点详解】 1. 十二经脉流注次序:...1. 《难经》 2. 整体观念,辨证论治 3. 心,脏腑,自然环境,社会环境 4. 生理之本,生命之动力,生命之主宰 【判断题】 1. 正确 2. 正确 3. 正确 4. 文档缺失,无法判断

    中医耳鼻喉科(医学高级)-多项选择(精选试题).doc

    7. 嗅觉与脏腑关系:根据《内经》和《难经》的记载,肺和肾是与嗅觉最为密切相关的两个脏器,分别负责呼吸和水液代谢,对嗅觉的敏感度有直接影响。 8. 口齿与脏腑:口齿健康与脾、心、肺、胆和胃等脏腑密切相关。...

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

    6. 中医经典著作:《黄帝内经》、《伤寒杂病论》、《神农本草经》和《难经》都是中医领域的经典文献。《黄帝内经》奠定了中医学基础理论;《伤寒杂病论》记载了多种治疗方法,包括人工呼吸;《神农本草经》是我国最...

    历年中医执业医师考试中医内科学考点汇总.doc

    病机在于六淫侵犯,导致卫表不和,肺气失宣。治疗策略分为辛温和辛凉两种,以应对不同类型的感冒。 2. 咳嗽:咳嗽病名最早见于《内经》,涉及肺、肝、脾和肾等多个脏器。明·张介宾将其分为外感和内伤两类。治疗...

    针灸学习题集(已排版).doc

    4. 针灸医学史上的三次大总结可能指的是《内经》的初步总结、《难经》的补充和完善以及《针灸甲乙经》的系统整理。 六、论述题涉及的知识点: 1. 针灸的起源可能追溯到新石器时代,随着石针的发现,逐渐发展为成熟...

    2019年广西崇左市国土资源局招聘模拟试题及答案解析.docx

    1. 表象的定义:在题目中提到的感觉、知觉和表象是心理学中的基本概念。感觉是对外界刺激的直接反应,如看到苹果的颜色、闻到其气味;知觉是对感觉信息的整合和理解,形成对事物的整体认知;表象则是事物不在眼前时...

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

    6. **病机鉴别**:感冒表现为肺气失宣、卫表不和;咳嗽则是肺气上逆。 7. **小病历鉴别**:出现表证的通常归为感冒。 ### 二、咳嗽 1. **术语来源**:“咳嗽”一词出自《内经》。 2. **理论基础**:“五脏六腑皆令...

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

    ### 1. 航海史上的重要人物 - **麦哲伦**:葡萄牙航海家,1519年至1521年间领导了人类历史上的第一次环球航行,证明了地球是圆形的。 - **郑和**:中国明朝时期的航海家,七次下西洋,最远到达非洲东岸和红海地区。...

    中医诊断学复习要点.doc

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

    2018中医执业医师考试复习资料完全版.doc

    7. 不寐在《内经》中被称为“不得卧”或“目不瞑”,明·李中梓将其病机归纳为五类,包括气虚、阴虚、痰滞、水停和胃不和。 8. 癫狂的病机与火有关,而《难经?二十难》则区分了癫与狂的阴阳属性。癫病主要涉及痰气...

Global site tag (gtag.js) - Google Analytics