JSP自动定时备份数据库
Jsp中 Servlet 是一个单例的处理Request Response的进程。
现在的要求是:管理员可以设置数据库定时自动备份,浏览器关掉后还可以自动备份。这点比PHP要简单不少。
下面案例:
public class Test extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
while(true){
try {
PrintWriter pw=new PrintWriter("d:/jsp_make.txt");
java.text.SimpleDateFormat fmt=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ms");
String nowTimeStr = fmt.format(new Date());
pw.println(nowTimeStr);
pw.close();
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}}
}
}
使用浏览器访问一下,然后把浏览器关掉,看生成的jsp_make.txt 里面的值在不变改变。
可是有一个问题,而目前这个问题在PHP中还没有办法解决,而JSP中可以轻松解决,这个问题是,当管理员访问这个 servlet 或是 .php后浏览器进行假死状态。这个问题是因为,有一个死循环在执行,所以会出现假死。PHP不支持多线程,自然没有什么好的方法。不过Java有好的解决方法,对 自动定时程序进行多线程处理另开一个线程来运行,就不会出现假死的问题了。
在Java中实现多线程的方法有两种,一实现 Runnable 接口,二继承 Thread 两者都要实现 run() 方法。
我这里是一个 servlet 本身就已经继承 HttpServlet 所以在这里实现Runnable 接口比较简单。
把 while死循环中的代码放到 run() 方法中。
修改后完整代码:
public class Test extends HttpServlet implements Runnable{
public void doGet(HttpServletRequest request, HttpServletResponse response){
//使用多线程编程
new Thread(new Test()).start();
}
public void run() {
while(true){
try {
PrintWriter pw=new PrintWriter("d:/jsp_make.txt");
java.text.SimpleDateFormat fmt=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ms");
String nowTimeStr = fmt.format(new Date());
pw.println(nowTimeStr);
pw.close();
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}}
}
}
好了,这下浏览器不会假死了。