设为首页 收藏本站
查看: 769|回复: 0

[经验分享] DB2下JAVA编程注意问题

[复制链接]

尚未签到

发表于 2016-11-15 05:09:32 | 显示全部楼层 |阅读模式
  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,然后将此表重建到此大表空间中

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300322-1-1.html 上篇帖子: DB2 V9.5 的db2diag.log文件保存地址修改 下篇帖子: DB2数据库常见问题汇总)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表