日期:2014-05-20  浏览次数:20726 次

哪位有时间帮我优化一下这个方法,因为执行完需要40秒左右
参数 funcCodeList有80条记录是固定的
public   void   createProjFuncTest(Long   projStaffId,   List   funcCodeList){
if   (funcCodeList   !=   null)   {
int   len   =   funcCodeList.size();
for   (int   i   =   0;   i   <   len;   i++)   {
Misfunc   misfunc   =   (Misfunc)   funcCodeList.get(i);
//   项目员工功能权限
ProjStaffFunc   projStaffFunc   =   new   ProjStaffFunc();
projStaffFunc.setFuncCode(misfunc.getMisfuncCode());
projStaffFunc.setProjStaffId(projStaffId);
//   创建项目员工的功能权限

Long   projEmpFuncId   =   new   Long(super.getNextIdFromSequence());
String   sql   =   "insert   into   "   +   "\r\n "   +   "         SYS_PROJ_STAFF_FUNC(   "//   项目员工功能权限表
+   "\r\n "   +   "         PROJ_EMP_FUNC_ID   "   +   "\r\n "   //   项目员工功能ID
+   "     ,   PROJ_STAFF_ID   "   +   "\r\n "   //   项目员工ID
+   "     ,   MISFUNC_CODE   "   +   "\r\n "   //   功能代码
+   "     )   "   +   "\r\n "   +   "values(   "   +   "\r\n "   +   "         ?   "   +   "\r\n "
+   "     ,   ?   "   +   "\r\n "   +   "     ,   ?   "   +   "\r\n "   +   "     )   "   +   "\r\n ";

Object[]   value   =   new   Object[]   {   projEmpFuncId,
projStaffFunc.getProjStaffId(),   projStaffFunc.getFuncCode()   };
getJdbcTemplate().update(sql,   value);
}
}
}

------解决方案--------------------
大部分时间应该消耗在数据库的更新上了吧, 把表主键贴一下
------解决方案--------------------
两个办法
1.别在循环里面做数据库连结,可在再方法的参数中巴connection传进去
2.使用Statement的批处理机制
stm.addBatch();
stm.executeBatch();
Spring得JDBC模版也要看场合来用的,虽然在代码量上作了很大的精简,但有时性能方面却不能令人满意啊
------解决方案--------------------
up!
------解决方案--------------------
新手发帖 乱说的啊

这快批处理没试过,但我刚做的东西直接用
insertrow都没这么慢的,应该把连接拿出去 做一次连接后 后边直接insert就可以了吧

------解决方案--------------------
可以考虑用存储过程去实现数据库的插入,然后在程序中调用存储过程