1、相对比较安全,可以防止sql注入 2、有预编译功能,相同操作批量数据效率较高
JDBC PreparedStatement 批量更新数据注意的问题
博客分类: Java相关 PreparedStatement 批量更新数据可以提升程序执行效率,缩短程序运行时间,但是在实际工作中运用时,发现要注意以下几个问题:系统环境:
JDK1.6.0_21
Oracle10g
Eclipse3.6.1
用到的jar包:
ojdbc6.jar
commons.logging-1.1.1.jar
commons-dbcp-1.4.jar
commons-pool-1.5.5.jar
commons-collections-3.2.1.jar
log4j-1.2.6.jar
spring2.5.6.jar
(1)虽然是批量提交,但当数据量大时应该将提交设置为每500次已提交(更具具体情况而定),这么干的好处可以节约内存资源,至少不会因为内存不够用而报内存溢出的异常,在有就是可以加快数据库的执行效率。
(2)connect.commit()后connect可能会被关闭,需要再次开启
事例代码如下:
- staticLoggerlog=Logger.getLogger(UpdateLog.class);
- staticfinalintCOMMIT=500;//每500条记录一提交
- Connectionconnect=null;
- PreparedStatementpstmt=null;
- Stringstrsql=null;
- **
- *办公用品结款
- *@paramsupid
- *@paramrows
- *@paramjg_je
- *@params_je
- *@paramcpid
- */
- publicvoidULogOffice(intsupid,introws,doublejg_je,doubles_je,List<CPInfoData>cpid){
- introwsTmp=0;
- try{
- connect=DBConn.getConnection();//打开一个池连接
- connect.setAutoCommit(false);
- //第一步:更新t_supplier_log表
- strsql="INSERTINTOt_bi_supplier_logVALUES(?,sysdate,?,?,?,0,'首次','办公厨房','SYSTEM','ONE')";
- insertInfo(supid,rows,jg_je,s_je);
- //第二步:更新syn_provid_psjh_mx表中lb1为40
- strsql="UPDATEsyn_provid_psjh_mxSETlb1='40'"+
- "WHEREjhdate=?ANDsup_id=?ANDlb=?ANDrkdh=?ANDjkdateisnull";
- if(cpid.size()!=0){
- for(CPInfoDatacpInfoData:cpid){
- //门店用sup_id、jhdate、lb、id确定唯一一条记录
- pstmt=connect.prepareStatement(strsql.toString());
- pstmt.setDate(1,Date.valueOf(cpInfoData.getJhdate().substring(0,10)));
- pstmt.setInt(2,supid);
- pstmt.setString(3,cpInfoData.getLb());
- pstmt.setString(4,cpInfoData.getDh().trim());
- pstmt.addBatch();
- if(rowsTmp%COMMIT==0){//每500条记录一提交
- pstmt.executeBatch();
- connect.commit();
- if(null==connect){//如果连接关闭了就在创建一个为什么要这样原因是conn.commit()后可能conn被关闭
- connect=DBConn.getConnection();
- connect.setAutoCommit(false);
- }
- }
- rowsTmp++;
- }
- pstmt.executeBatch();
- connect.commit();
- }
- connect.setAutoCommit(true);
- log.info("ULogOffice办公用品["+supid+"]数据库更新完毕");
- }catch(Exceptione){
- try{
- connect.rollback();
- log.info("ULogOffice办公用品["+supid+"]数据库更新异常-回滚["+e.getMessage()+"]");
- }catch(SQLExceptione1){
- e1.printStackTrace();
- }
- e.printStackTrace();
- }finally{
- closePstmt(pstmt);
- closeConnection(connect);
- }
- }