DB2下JAVA编程注意问题

1、DB2升级后JDBC无法连接
原因:DB2每个补丁JDBC都会发生改变,且不向下兼容,所以每次打过补丁后都要替换Query中的JDBC驱动
解决:每次数据库升级后,在数据库安装目录(db2主目录/sqllib/java)下拷贝db2java.zip到Query中覆盖原有jdbc驱动,如需要其他包也一并拷出

2、数据库主机重启后JDBC无法连接
原因:主机重启后JDS服务中断,需要重新启动JDS(大部分无法连接数据库的问题是由于不知道JDS的存在,没有启动JDS监听jdbc连接的端口造成)
解决:在安装DB2的主机上执行db2jstrt 6789命令,打开JDS在6789端口的监听(如果采用其他端口,请替换6789为真实端口号)

3、DB2升级后JDBC取元数据(如调用getSchemas()、getTables()等方法)时报错
原因:DB2下用JDBC取元数据可能遇到 CLI -805错误,这是由于DB2升级某一FixPack后产生的问题,需要手工重新绑定schema,此问题IBM一直没修复,存在于所有后续FixPack中
解决:在安装DB2的主机上执行如下命令,重新绑定schema
db2 terminate
db2 connect to <database-name>
db2 bind db2主目录/sqllib/bnd/db2schema.bnd blocking all grant public sqlerror continue
db2 terminate

4、锁系统表造成无法创建、删除表
原因:创建、删除表之前,如果查询了系统表(比如从sysibm.systables查询待删除的表是否已存在),在锁空间不够的情况下,容易造成表升级,在systables上产生S表锁,此时create表和drop表操作将不可进行
原理分析:
查询系统表systables时,systables表会产生IS表锁(意向读锁)并对操作的行产生S行锁,如果这时锁空间不足(可能是同时在进行的业务产生大量行锁),导致锁升级的话,将在systables上产生S表锁,而create或者drop表时,需要向systables中插入或者删除对应的记录,这时会在systables上申请IX表锁(意向写锁),而S表锁和IX表锁不相容,如果S读锁不能及时释放,则后续的IX表锁无法申请到,导致操作停滞在create或drop语句处无法进行下去
解决:在程序中访问系统表时,不要和create或drop操作放在一个事务中,需在访问系统表后进行一次提交,然后再进行下面的操作
在存储过程中判断表是否存在时,尽量不要访问系统表,可以用自定义错误的方式捕获表不存在的错误,进而直接drop表而不需要判断此表是否存在
存储过程中使用自定义错误举例:
CREATE PROCEDURE test
(
      OUT ERRMSG INTEGER
)
BEGIN
DECLARE      varSql VARCHAR(1000);
declare sqlcode             integer default 0;                         --程序状态
DECLARE no_table CONDITION FOR SQLSTATE '42704'; --声明自定义错误,drop不存在的表时不退出存储过程
DECLARE CONTINUE HANDLER FOR no_table
       set errMsg = 0;
        declare exit handler for sqlexception,sqlwarning,not found      --异常处理申明
          set errMsg=sqlcode;  

set varSql='drop table test1';
EXECUTE IMMEDIATE varSql;

set varSql = 'create table test1';
EXECUTE IMMEDIATE varSql;

END;

5、字段过长造成无法order by、group by
原因:字段过长造成无法order by、group by的问题,是由于表字段长度之和大于表空间所在的缓冲池(bufferpool)容量造成的,如果表所在表空间的bufferpool容量为4K(默认为4K),但表中字段长度的和超过4K,则无法对表进行order by、group by等操作
解决:尽可能减小字段长度,将超长字段改为LOB类型,如果确实需要超长字段,只能建立一个新的表空间,对这个表空间指定较大的bufferpool,然后将此表重建到此大表空间中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值