如题,我使用timer做定时删除,可以手动开启删除,手动关闭;也可以定时删除。如果想要删除的数据比较多的时候,启动删除功能,它总是无法一次性删除完毕,总是要等到下一次启动删除功能是才会继续删除刚才没删完的,而且有时候要这样好几次才能弄完。
我想设定的是一天自动删除一次,这样的话,会有很大的误差的吧。
这里面有什么很深奥的机制吗?
求大侠们帮忙!!!!!
以下是我Myclock.java和MyTask.java的源代码,我是通过Myclock.java中timer.schedule()调用MyTask.java,工程的总体架构是Struts+Hibernate,采用MySql数据库
Myclock.java
- Java code
public class Myclock extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ String fun = request.getParameter("fun"); ServletContext application=getServletContext(); request.setAttribute("fun", fun); Date date=null; DateFormat df=new SimpleDateFormat("yyyyMMddHHmmss"); String str="2012509161000"; try { date=df.parse(str); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(fun.equals("1")){ //fun是前台JSP传递过来的值,用于判断是否是手动开启timer或关闭 Timer timer=new Timer(); [color=#FF0000] timer.schedule(new MyTask(),date,5*60*1000L);[/color] application.setAttribute("timer",timer); request.getRequestDispatcher("/jsp/administer/delData.jsp").forward(request,response) ; }else{ Timer timer = (Timer)application.getAttribute("timer"); timer.cancel(); application.setAttribute("timer", null); request.getRequestDispatcher("/jsp/administer/delData.jsp").forward(request,response) ; } } public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ doGet(request,response); } }
MyTask.java
- Java code
public void run() { a++; System.out.println("***********************a==="+a+"**************************************"); GetdateFormat time1 = new GetdateFormat(); Timestamp time_now = time1.getDatetime(); System.out.println("现在时间是:"+time_now+"============"); Long oneday = 24*60*60*1000L; Timestamp time = new Timestamp(time_now.getTime()-oneday); List <FeedData> feedData = feedDataDao.getAllFeedDaoBeforeTime(time); int amount=feedData.size(); if(amount!=0){ for(int i=0;i<amount+1;i++){ ; feedDataDao.delete(feedData.get(i)); amount--; System.out.println("amount===="+amount); FeedData temp = feedData.get(i); //将删除的数据存入del_data_bck表中 DelDataBackup del_data = new DelDataBackup(); del_data.setFeedDatastream(temp.getFeedDatastream()); del_data.setCvfdsdata_bck(temp.getCvfdsdata()); del_data.setCddsdatatime_bck(temp.getCddsdatatime()); System.out.println("del_data====="+del_data); delDataBckDao.create(del_data); //自动生成数据 feedData.get(i).setCddsdatatime(time_now); System.out.println("新数据的修改日期为:"+temp.getCddsdatatime()); feedDataDao.create(temp); //测试时用 //判断是否要修改“更新日期”,此时使用的最后一次更新数据是刚刚自动生成数据时的时间;真正应该使用的是上一次的更新时间 Timestamp last_update_time = feedData.get(i).getFeedDatastream().getFeedInfo().getCdlastupdatetime(); System.out.println("该数据最后一次更新是:"+last_update_time); if(temp.getCddsdatatime().after(last_update_time)){ temp.getFeedDatastream().getFeedInfo().setCdlastupdatetime(time_now); FeedInfo feedInfo = feedData.get(i).getFeedDatastream().getFeedInfo(); feedDao.update(feedInfo); System.out.println("修改后,最后一次更新日期为:"+feedInfo.getCdlastupdatetime()); } } } else {System.out.println("========暂无要删除的数据!=========");} }}