关于hibernate和db2的一些问题

 1.使用hibernate存取blob,可参考使用下面url连接db2:
jdbc:db2://10.2.5.130:50000/testDB:driverType=4;fullyMaterializeLobData=true;fullyMaterializeInputStreams=true;progressiveStreaming=2;progresssiveLocators=2;
2.错误:SQLCODE:   -401,   SQLSTATE:   42818,
    操作符错误,编程的时候编码不严谨,如在varchar字段使用操作符号 status=0。
3.SQL0443N SQLSTATE=38553 错误:
    从命令行,输入:db2cmd
    然后输入:db2
           TERMINATE
               CONNECT TO <dbname>
                   BIND <path>/db2schema.bnd BLOCKING ALL GRANT PUBLIC sqlerror continue
                   TERMINATE  
4.SQLCODE=-302, SQLSTATE=22001
    常见报错信息如下:

    1)com.ibm.db2.jcc.b.jm: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null
    2)ERROR DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704,

    【分析】根据报错信息看,问题的 产生根源为在支撑的关系型数据库中一些关键字段的字段长度设计太小,插入到字段的数值长度超出了字段的设计大小,从而引起了插入信息的中途截断。

    【解决思路】调整报错数据表中的相关字段大小到需求范围,经过测试这里的扩展幅度为新大小为字段初始大小的4倍是合适的。因为DB2数据库的默认表空间页面大小为4K,4K的页面对应的同一数据表的所有字段和长度不能超过4051B,所以扩展相应字段的大小受到了边界的限制。而DB2数据库一旦在数据表创建后,其页面大小是不可更改的,亦即默认4K的页面大小不能再修改为32K。解决思路如下:欲排除错误,必须增加报错字段的长度,欲增大字段长度必须拓展表空间的页面大小,欲调整表空间页面大小必须使得所建各表的缓冲池采用自己事先定义好的页面大小为32K的缓冲池。

    【步骤】

    方法1,在生成数据表之前,先替换掉系统默认的页面大小为4K的表空间,也就是USERSPACE1。考虑到DB2的自身限制,采用如下方法,删除系统原有的表空间USERSPACE1,然后新建同名的表空间USERSPACE1,为了使该表空间的页面大小为32K,此时一定要注意,缓冲池要选择自己事先建立的页面大小为32K的缓冲池(如LARGE_POOL)。在做完上述操作后,再设置系统的各项数据库连接参数,生成所需的各项数据表。此方法可以排除潜在字段扩展问题,操作简单,建议使用。

    方法2,在设置好系统的各项连接参数后,系统会在DB2中生成所需的各项数据表。那么找出产生错误的数据表后,生成创建该表的SQL脚本,然后删除该数据表,编辑该SQL脚本,在最后一行中,用新创建的页面大小为32K的表空间(如EKP_SPACE)替换系统默认的页面大小为4K的表空间(如USERSPACE1)后,重新生成同名数据表即可。缺点:需要找出所有需要扩充字段的数据表进行替换。工作量比较大,稍有遗漏就会有潜在的字段扩展问题产生。

 
5.非常奇怪的问题。(碰到相同的问题,下面引用java自由人的描述,来自:http://www.javayou.com/diary/3864)
    请先看下面这段代码,这段代码的本意是从标签表中读取引用最多的前几个标签,这段代码在DB2数据库下执行也没问题,但是出来的数据不是标签名,而是一些顺序的数字,而其他数据库完全正确。
    public static List listHotTags(int count){
           Session ssn = getSession();
           String sql = "SELECT tag_name,COUNT(*) FROM dlog_tag GROUP BY tag_name ORDER BY 2 DESC";
           SQLQuery query = ssn.createSQLQuery(sql);
           query.setMaxResults(count);
           List tags = new ArrayList();
           List results = query.list();
           for(int i=0;results!=null && i
           tags.add(((Object[])results.get(i))[0]);
           }
           return tags;
    }

    非常的奇怪,打开Hibernate显示SQL语句的开关后发现Hibernate生成的SQL语句是

    select * from ( select rownumber() over(ORDER BY 2 DESC) as rownumber_, tag_name,COUNT(*)  FROM BLOG.dlog_tag GROUP BY tag_name ORDER BY 2 DESC ) as temp_ where rownumber_ <= ?

    也就是说结果集中变成了三个列,而第一个是行号,第二个才是我们想要的标签名。所以上面的代码就要改为 tags.add(((Object[])results.get(i))[1]); 才行!

    我觉得关键的问题还是Hibernate对setMaxResults方法的处理上!

    那这样程序就不具备移植性了:( 怎么办呢?

    在网上搜索相关问题发现了这个

    http://forum.hibernate.org/viewtopic.php?p=2292876

    不过这个问题提了很久了,而且我用的是Hibernate 3.1.3 怎么还是同样的问题出现呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值