• java实现定时备份mysql数据库-----已通过测试


    配置文件中的信息

          sqlurl=C://Program Files (x86)//MySQL//MySQL Server 5.0//bin//mysqldump -h localhost -uroot -pwjg user
          path=F:/test.sql
          backuptime=16:34:00

    备份数据库

                public class TestMysql {
                       //读取配置文件中的信息
                       //MySql的安装bin目录路径和dump等参数
                static String sqlurl=GetProperty.getPropertyByName("property","sqlurl");
                 //保存备份文件的路径及名称
                  static String path=GetProperty.getPropertyByName("property","path");

                 public TestMysql(){
                 backup(); // 备份数据库
                 System.out.println("备份数据库成功!");
                }

               public static void backup(){
                   try {
                     Runtime rt =Runtime.getRuntime(); //返回与当前的Java应用程序的运行时对象
                    // 调用 调用mysql的安装目录的命令
                    Process child = rt.exec(sqlurl);
                 // 设置导出编码为utf-8。这里必须是utf-8
                 // 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
                    InputStream in = child.getInputStream();// 控制台的输出信息作为输入流
                    InputStreamReader xx = new InputStreamReader(in, "utf-8");
              // 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码
                    String inStr;
                    StringBuffer sb = new StringBuffer("");
                    String outStr;
             // 组合控制台输出信息字符串
                    BufferedReader br = new BufferedReader(xx);
                    while ((inStr = br.readLine()) != null) {
                    sb.append(inStr + " ");
        }
                    outStr = sb.toString();
             // 要用来做导入用的sql目标文件:
                    FileOutputStream fout = new FileOutputStream(path);
                    OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
                    writer.write(outStr);
                    writer.flush();
                    in.close();
                    xx.close();
                    br.close();
                    writer.close();
                    fout.close();
                    System.out.println("");
              } catch (Exception e) {
                  e.printStackTrace();
             }
          }
    }

    调用要执行的内容

          public class NFDFlightDataTimerTask extends TimerTask {

          private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);
         @Override
          public void run() {
         try {
         //在这里写你要执行的内容
      new TestMysql();

      } catch (Exception e) {
      log.info("-------------解析信息发生异常--------------");
         }
       }

      }

    在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后
    发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况
    发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。

             public class TimerManager {
        //时间间隔 一天时间
              private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;

             public TimerManager() {

            //获取并处理配置文件中的时间
            String backuptime=GetProperty.getPropertyByName("property","backuptime");
            String[] time=backuptime.split(":");
            int hours=Integer.parseInt(time[0]);
            int minute=Integer.parseInt(time[1]);
          int second=Integer.parseInt(time[2]);

            Calendar calendar = Calendar.getInstance();

    /*** 定制每日2:00执行方法 ***/
            calendar.set(Calendar.HOUR_OF_DAY,hours);
            calendar.set(Calendar.MINUTE, minute);
            calendar.set(Calendar.SECOND, second);

            Date date=calendar.getTime(); //第一次执行定时任务的时间

    //如果第一次执行定时任务的时间 小于 当前的时间
    //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
           if (date.before(new Date())) {
            date = this.addDay(date, 1);
           }

           Timer timer = new Timer();

           NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
         //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
           timer.schedule(task,date,PERIOD_DAY);
      }

    // 增加或减少天数
          public Date addDay(Date date, int num) {
          Calendar startDT = Calendar.getInstance();
          startDT.setTime(date);
          startDT.add(Calendar.DAY_OF_MONTH, num);
          return startDT.getTime();
        }
    }

    创建一个监听器

             public class NFDFlightDataTaskListener implements ServletContextListener {

             public void contextInitialized(ServletContextEvent event) {
                          new TimerManager();
              }

             public void contextDestroyed(ServletContextEvent event) {
             }

        }

    然后要在web.xml里面配置监听器

    <listener>
          <listener-class>
              com.zhongren.Test.NFDFlightDataTaskListener
          </listener-class>
    </listener>

  • 相关阅读:
    C#正则表达式判断输入日期格式是否正确
    Linq 总结
    sql存储过程
    uploadify多文件上传实例--C#
    Get W3WP List when Debugging
    SharePoint 2010 BI:Chart Web Part
    Versioning SharePoint 2010 Workflow In VS
    Multilingual User Interface (MUI) In SharePoint 2013
    Create Custom Modification Form In VS 2012-Part1
    Create Custom Modification Form In VS 2012-Part2
  • 原文地址:https://www.cnblogs.com/wangjiagang/p/5994068.html
Copyright © 2020-2023  润新知