Java(JFinal)实现sqlserver2017的数据库的备份与恢复

Posted wyhluckydog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java(JFinal)实现sqlserver2017的数据库的备份与恢复相关的知识,希望对你有一定的参考价值。

1.连接数据库的代码:

package com.once.xfd.dbutil;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class DataBaseUtil {
    /**
     * 获取数据库连接
     * @return Connection 对象
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=master";
            String username = "sa";
            String password = "123456";    
            conn = DriverManager.getConnection(url, username, password);
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2.备份功能代码:

/**
     * 备份数据库
     * @return backup
     * @throws Exception
     */
public String backup() {
        ActionContext context = ActionContext.getContext();
        HttpServletRequest request = (HttpServletRequest) context
                .get(ServletActionContext.HTTP_REQUEST);
        String webtruepath = request.getParameter("path");
        String name = "dbname"; //数据库名
        try {
            File file = new File(webtruepath);
            String path = file.getPath() + "\\\\" + name + ".bak";// name文件名
            String bakSQL = "backup database 数据库名 to disk=? with init";// SQL语句
            PreparedStatement bak = DataBaseUtil.getConnection()
                    .prepareStatement(bakSQL);
            bak.setString(1, path);// path必须是绝对路径
            bak.execute(); // 备份数据库
            bak.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "backup";
    }

3.还原数据库代码(调用存储过程

    /**
     * 数据库还原
     * @return recovery
     */
    public String recovery() {
        ActionContext context = ActionContext.getContext();
        HttpServletRequest request = (HttpServletRequest) context
                .get(ServletActionContext.HTTP_REQUEST);
        String webtruepath = request.getParameter("path");
        String name = "******";
        String dbname = "******";
        try {
            File file = new File(webtruepath);
            String path = file.getPath() + "\\\\" + name + ".bak";// name文件名
            String recoverySql = "ALTER   DATABASE   数据库名   SET   ONLINE   WITH   ROLLBACK   IMMEDIATE";// 恢复所有连接
            
            PreparedStatement ps = DataBaseUtil.getConnection()
                    .prepareStatement(recoverySql);
            CallableStatement cs = DataBaseUtil.getConnection().prepareCall("{call killrestore(?,?)}");
                cs.setString(1, dbname); // 数据库名
                cs.setString(2, path); // 已备份数据库所在路径
                cs.execute(); // 还原数据库
                ps.execute(); // 恢复数据库连接   
          //执行查询数据库操作
              PreparedStatement pStatement=DataBaseUtil.getConnection().prepareStatement("select * from [t_sjbf]");
              System.out.println(pStatement.execute()); 
              //将连接异常在后台进行处理,处理完这一次异常之后,就可以建立正常的数据库连接
              dao.find("select * from [t_sjbf]");     
          } catch (Exception e) {
            e.printStackTrace();
        }
        return "recovery";
    }

代码中标为紫色部分的代码并不会影响数据的还原,只是在JFinal中数据还原后连接不会在第一时间内连接上,这样前台在刷新页面的时候便会出现警告,为了防止前端出现这样的警告,把数据库的连接操作在后台进行处理(通过dao.find("select * from [t_sjbf]");这条语句就可以建立起与数据库的连接)。

4.存储过程代码:

create proc killrestore (@dbname varchar(20),@dbpath varchar(40))       
as       
begin       
declare @sql   nvarchar(500)       
declare @spid  int       
set @sql=\'declare getspid cursor for select spid from sysprocesses where dbid=db_id(\'\'\'+@dbname+\'\'\')\'       
exec (@sql)       
open getspid       
fetch next from getspid into @spid       
while @@fetch_status <> -1       
begin       
exec(\'kill \'+@spid)       
fetch next from getspid into @spid       
end       
close getspid       
deallocate getspid       
restore database @dbname from disk= @dbpath with replace
end    

注意:存储过程创建在系统数据库master下面,切记,否则会报错!!!

在执行数据还原之前应该在master数据库中建立此存储过程,否则会报错。

建立存储过程的步骤如下:

打开SqlServer-->数据库-->系统数据库-->master-->可编程性-->存储过程-->右击存储过程-->在新打开的页面中复制上面的存储过程的代码-->全选这段代码-->执行这段代码-->刷新master数据库,就会出现新建的存储过程了

如下图所示:

 

以上是关于Java(JFinal)实现sqlserver2017的数据库的备份与恢复的主要内容,如果未能解决你的问题,请参考以下文章

JFinal实现伪静态

投资20万研发的JFinal项目《旅游线路营销管理系统》准备公开课中

jfinal框架教程

Jfinal尝鲜(填坑)

JFinal架构简介

Jfinal学习和环境的搭建