1、相对比较安全,可以防止sql注入
2、有预编译功能,相同操作批量数据效率较高
JDBC PreparedStatement 批量更新数据注意的问题
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可能会被关闭,需要再次开启
事例代码如下:
- static Logger log = Logger.getLogger(UpdateLog.class);
- static final int COMMIT = 500; //每500条记录一提交,通过取模的方式
- Connection connect = null;
- PreparedStatement pstmt = null;
- String strsql = null;
- **
- * 办公用品结款
- * @param supid
- * @param rows
- * @param jg_je
- * @param s_je
- * @param cpid
- */
- public void ULogOffice(int supid,int rows,double jg_je,double s_je,List<CPInfoData> cpid){
- int rowsTmp = 0;
- try {
- connect = DBConn.getConnection(); //打开一个池连接
- connect.setAutoCommit(false);
- //第一步:更新t_supplier_log 表
- strsql = "INSERT INTO t_bi_supplier_log VALUES(?,sysdate,?,?,?,0,'首次','办公厨房','SYSTEM','ONE')";
- insertInfo(supid, rows, jg_je, s_je);
- //第二步:更新syn_provid_psjh_mx 表中 lb1 为 40
- strsql = "UPDATE syn_provid_psjh_mx SET lb1='40' " +
- "WHERE jhdate=? AND sup_id=? AND lb=? AND rkdh=? AND jkdate is null";
- if(cpid.size()!=0){
- for (CPInfoData cpInfoData : 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 (Exception e) {
- try {
- connect.rollback();
- log.info("ULogOffice 办公用品 [" + supid +"] 数据库更新异常-回滚[" + e.getMessage() + "]");
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- e.printStackTrace();
- }finally{
- closePstmt(pstmt);
- closeConnection(connect);
- }
- }