关于DB2批量更新数据方式的思考

5 篇文章 0 订阅
由于负责公司的系统的运维与开发,为实现系统之间的SOA数据共享,少不了要进行数据库表啊什么之类的数据共享。做JAVA的,除了数据库方面的sql任务,自然而然能够想到利用javaapplication解决一部分数据更新任务,尤其是涉及到还要生成excel报表之类的附加功能,更是需要java相关的插件生成更加方便。
那么就需要自己写一些利用java(JDBC)链接DB2,并进行增删改查的功能。那么基类很简单,查询类很简单。但有时候需要一条条的更新数据表中的全部数据,一张表下来要做很多数据库操作,这样的事情,应该如何写?
做了一些尝试,归纳起来无外乎两种情况:
1 建立数据库链接,查询,得到数据,保存,关闭链接,进行第二次查询。
2建立数据库链接,查询,保存,继续查询,保存。。。最后关闭数据库链接(即数据库链接的单例模式,所有查询都利用一个链接完成,仅在链接不存在时建立新链接)
首先利用第一种方式进行更新,到500条左右数据的时候报错:db2端口正被使用,无法链接。。。经过思考认定,jdbc中,connect的close方法不可能完全实施,java端发出了关闭链接命令,数据库端并未关闭,java端再发出新的链接请求,就会被拒绝。有心在close后写延时,但简单一算,一个查询延时1s,3000个就是50分钟,效率大为降低,不可行。
接着利用第二种方式更新数据,1300条左右的时候报错:
DB2 SQL Error: SQLCODE=-805, SQLSTATE=51002,SQLERRMC=NULLID.SYSLH203 0X5359534C564C3031, DRIVER=3.50.152
网上查之,资料很少,大多不知所云,有一个说法比较靠谱,如下:
Your databases has only 3 packages of thiskind. 
They are SYSLH200,201,202. 
But your query requires one more additional package SYSLH203. Ifyou are a DBA, go to SQLLIB/BND directory then issue the followingcommand 

db2 bind @db2cli.lst blocking all grant public sqlerror continueCLIPKG 5 

If you are application programmer, contact your DBA to performabove bind. You can bind upto CLIPKG 30.
恩 大致意思说数据库只有 SYSLH200,201,202.三个系统包(自己感觉应该是用来生成随机ID之类的),在同一个连接中,每做一个查询,就要使用一个ID,查询多了,三个包中的资源都已经耗尽,系统要取第四个包的时候报错了。因为没有找到名为SYSLH203的第四个包,那么,我们只需要执行
db2 bind @db2cli.lst blocking all grant public sqlerror continueCLIPKG 5 
这个牛B的命令,那么就能够绑定,让系统包扩充到5个。如果你还想更多,那么改数字就行,最多不超过30个。
恩,其实还有一个说的更详细:
The -805 error that you are receiving on the package SQLLD003 islikely 
occurring because you are running out of sections in our CLIpackages. 
We create CLI dynamic placeholder packages that are created frombinding  
our db2cli.lst bind file.   Bydefault, there are 3 small            
packages, and 3 large packages created during bindtime.   The erroron 
the SQLLD003 means we are looking for a big package with hold foran    
additional section (4th big package), but we can't findit.   We needthe  
package to continue executing the dynamic SQL from the application.   
This problem can be resolved 2 different ways.                 
1. You can create more large packages by rebinding your db2cli.lstfile 
and specify the CLIPKG in the BIND command to a largernumber.   The   
default CLIPKG value is 3, the maximum is 30.                   
2. Adding CLIPKG to you db2cli.ini and allowing the Auto-Binder to     
Create the new package when the 1st connectionoccurs.
他提出了两种解决方式:1与上一个说法解决方案一致;2就更厉害了,说可以在  db2cli.ini里面增加一个什么东东,那么数据库会在查询的时候自动增加绑定新的包。
但由于第二种说法没有给出具体的解决方式,我这个低手只好使用第一种方式解决。跑到linux里面运行下上面的命令,结果很悲剧,如下:
关于DB2批量更新数据方式的思考

思考后认定,文件位置不对,于是运行命令
关于DB2批量更新数据方式的思考
于是找到文件位置,运行
关于DB2批量更新数据方式的思考
问题解决。

总结下这类工作的要领;
1首先检查你的程序,若无必要,数据本身的整理尽量利用SQL完成。(上例此路不通,需要在查询中间根据条件调用webservice获取数据更新数据表,无法整合查询)。尽可能让多条查询变为一条,避免循环查询,执行上千条SQL的可能。我也曾经有过循环查询,最后调整策略,整合为30多条查询就搞定的。
2 循环查询中,不要使用非单例模式,会造成数据库端口堵塞,解决方式也欠佳(延时)。
3 使用单例模式的,如出现上述问题,利用文中方法解决。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值