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的数据库的备份与恢复的更多相关文章
- JAVA使用JDBC技术操作SqlServer数据库执行存储过程
Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带 ...
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Da ...
- jTDS Java连接SQL Server 2000数据库
Java连接SQL Server 2000数据库时,有两种方法: (1)通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别 是mssqlserver.jar.msutil.ja ...
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- Java通过JDBC 进行MySQL数据库操作
转自: http://blog.csdn.net/tobetheender/article/details/52772157 Java通过JDBC 进行MySQL数据库操作 原创 2016年10月10 ...
- java通过Access_JDBC30读取access数据库时无法获取最新插入的记录
1.编写了一个循环程序,每几秒钟读取一次,数据库中最新一行数据 连接access数据库的方法和查询的信息.之后开一个定时去掉用. package javacommon.util; import jav ...
- java用JDBC连接MySQL数据库的详细知识点
想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...
- Java连接并操作SQLServer数据库
本人只需在项目中引入sqljdbc4.jar 包即可 ----------------------------------------- 在JAVA中如何连接SQL Server数据库 - hangh ...
随机推荐
- Redis进阶实践之四Redis的基本数据类型(转载4)
Redis进阶实践之四Redis的基本数据类型 一.引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软 ...
- 转: 日期格式参考extjs api文档中的Date类型
var md = new Ext.form.DateField({ //下面的格式是:2000-01-01 00:00:00 format: 'Y-m-d H:i:s', ............ } ...
- Android高级控件(下)
Chronometer计时器 常用的方法 getBase() 基准时间 setFormat 设置显示格式 start() 开始计时 stop() 停止计时 setOnChronometerListen ...
- javascript原型链中 this 的指向
为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = { d: 40 }; var a = { x: 10, calculate: function (z) ...
- C# 保证数据长度相同
/// <summary> /// 保证数据长度相同 /// </summary> /// <param name="obj"></par ...
- 吴裕雄 30-MySQL 及 SQL 注入
如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题.本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符.所谓SQL注入,就是通过 ...
- git---远程仓库版本回滚
开发中,发现有错误版本提交带远程分支master,怎么处理? 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回 ...
- 1.5.7、CDH 搭建Hadoop在安装之前(定制安装解决方案---配置单用户模式)
配置单用户模式 在传统的Cloudera Manager部署中,管理每台主机上的Hadoop进程的Cloudera Manager Agent以root用户身份运行.但是,某些环境会限制对root帐户 ...
- sed常见用法总结
编辑文本 sed -i '1i xyz' test.txt 在第一行之前 sed -i '1a xyz' test.txt 在第一行之后插入 sed -i '1c xyz' test.txt 把第一行 ...
- 【OpenGL】三角形
步骤 初始化顶点数组对象VAO 分配顶点缓冲对象VBO 将顶点数据载入缓冲对象中 glBufferData() 链接顶点属性 glVertexAttribPointer(指定了顶点着色器的变量与我们存 ...