学生申请学科竞赛活动,表单中有学科竞赛的申报信息和部分附件,需要做到将上传文件和表单数据提交保持一致性。
将上传文件和插入表单数据放到事务汇总去处理,由于表单的数据我们可以控制,但是上传的文档不好控制。一方面我就把表单数据提交放置在文件上传前面,这样当表单数据提交发生异常我们可以回滚,文件并未上传,当文件上传发生异常时,我们可以回滚数据库的数据,只有当文件正常上传时我们才提交数据库数据。。。
---------------------------------------------------------------------------------------------------------------------------------------
1 @Override 2 public boolean applActivity(XkTeam team, Document doc, DocType doctype, 3 FileInputStream fin) { 4 5 boolean flag = true; 6 FileOutputStream fos = null;//文档输出流 7 // ------------处理需要向数据库提交的文档、文档类型及申报信息-------------------- 8 // 开启事务,设置不自动提交 9 JDBCTools.startTransaction(); 10 11 try { 12 // 判断是个人申报还是团体申报调用不同的方法 13 // 个人申报 14 if (team.getAppType() == 0) { 15 16 flag = idao.addPersonApp(team); 17 //更新当前申报人数 18 flag = idao.updateCurrentNum(team.getAppType(),1); 19 } 20 21 // 团体申报 22 if (team.getAppType() == 1) { 23 24 25 flag = idao.addTeamInfor(team); 26 flag = idao.addTeamMember(team.getMemberlist()); 27 //更新当前申报人数 28 flag = idao.updateCurrentNum(team.getActiId(), team.getMemberlist().size()); 29 } 30 31 if(doc != null && doctype != null){ //处理用户是否上传文档 32 // 调用dao层插入文件的方法 33 flag = idao.addDocument(doc); 34 // 调用dao层插入文件类型方法 35 flag = idao.addDocType(doctype); 36 37 // ---------------处理上传文档------------ 38 // 1.创建上传文档File 39 File file = new File(doc.getDoc_path()); 40 // 2.创建写文档对象 41 fos = new FileOutputStream(file); 42 // 3.创建缓冲流 43 byte[] buffer = new byte[1024]; 44 int len = 0; 45 while ((len = fin.read(buffer)) > 0) { 46 // 写入文件 47 fos.write(buffer, 0, len); 48 } 49 } 50 // 提交 51 JDBCTools.commit(); 52 } catch (Exception e2) { 53 e2.printStackTrace(); 54 // 发生异常回滚 55 JDBCTools.rollback(); 56 throw new RuntimeException("申报失败,请联系管理员!", e2); 57 } finally { 58 // 关闭资源 59 JDBCTools.setCommitTrue(); 60 JDBCTools.close(); 61 62 if(fos != null){ 63 try { 64 fos.close(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 } 69 } 70 71 return flag;
时间: 2024-10-20 07:56:20