日期:2014-05-16  浏览次数:20466 次

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)后,重新生成同名数据表即可。缺点:需要找出所有需要扩充字段的数据表进行替换。工作量比较大,稍有遗漏就会有潜在的字段扩展问题产生。