要是没有断开连接就会报: com.microsoft.sqlserver.jdbc.SQLServerException: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:320) at com.once.xfd.struts2.action.system.ManageDatabaseAction.recovery(ManageDatabaseAction.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 这个异常
我在执行还原数据库的时候 不是有再进行一次连接吗?String reSQL = "restore database xinfadi_testDB from disk=? with replace"; // 还原数据库 DataBaseUtil dbu = new DataBaseUtil(); Connection conn = dbu.getConnection(); PreparedStatement recovery = conn.prepareStatement(reSQL);
存储过程:create proc killspid (@dbname varchar(20)) 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 end 在数据库的查询分析器里测试成功了,语句如下:use master exec killspid 'xinfadi_testDB'restore database xinfadi_testDB from disk='d:\\xinfadi.bak' with replace已为数据库 'xinfadi_testDB',文件 'xinfadi' (位于文件 1 上)处理了 557208 页。 已为数据库 'xinfadi_testDB',文件 'xinfadi_log' (位于文件 1 上)处理了 2 页。 RESTORE DATABASE 成功处理了 557210 页,花费 118.640 秒(36.692 MB/秒)。但是在程序中用java调用时,却出现异常,代码如下:String path = file.getPath() + "\\" + name + ".bak";// name文件名 String reSQL = "use master exec killspid 'xinfadi_testDB'restore database xinfadi_testDB from disk=? with replace"; // 还原数据库 PreparedStatement recovery = DataBaseUtil.getConnection() .prepareStatement(reSQL); // 执行还原数据库 recovery.setString(1, path); if (!recovery.execute()) over = "还原成功"; else over = "还原失败";异常: ERROR - Connection reset by peer: socket write error Exception in thread "Timer-0" org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:627) at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921) at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:913) at com.once.xfd.hibernate.auction.service.AuctionBidService.findAuctionsToUnStart(AuctionBidService.java:433) at com.once.xfd.hibernate.auction.service.AuctionBidService.saveAuctionStarting(AuctionBidService.java:477) at com.once.xfd.daemon.auction.ComputeResultsTask.run(ComputeResultsTask.java:22) at java.util.TimerThread.mainLoop(Unknown Source) at java.util.TimerThread.run(Unknown Source) Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.loader.Loader.doList(Loader.java:2223) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:930) at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419) ... 8 more
可以考虑把数据库备份处理写到一个批处理去,然后用java调用该批处理
com.microsoft.sqlserver.jdbc.SQLServerException: 因为数据库正在使用,所以无法获得对数据库的独占访问权。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:320)
at com.once.xfd.struts2.action.system.ManageDatabaseAction.recovery(ManageDatabaseAction.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
这个异常
DataBaseUtil dbu = new DataBaseUtil();
Connection conn = dbu.getConnection();
PreparedStatement recovery = conn.prepareStatement(reSQL);
所以这一切处理,要么你就做到一个事务中,一次调用,要么就把这些处理写在批处理中,直接调用批处理
在你的另一个帖子里有人给你回复用存储过程实现的,你可以在java中调用那个存储过程试试看
调用存储过程 for example
Class.forName(your_driver);
Connection conn = DriverManager.getConnection(url, user, password);
CallableStatement proc = conn.prepareCall("{ call dbo.p_RestoreDb(?,?) }"); //如果无参数,直接call dbo.p_RestoreDb()
proc.setString(1, xxx); //那个帖子的存储过程是无参数的,所以这里可以不要
proc.setString(2, yyy);
proc.execute();
其实你也可以用PreparedStatement的execute或者直接executeUpdate,都差不多的至于用批处理的方式,你要知道备份和还原命令,然后通过这些命令写一个bat,然后在java中调用
如
Runtime.getRuntime().exec("xxx.bat");至于备份和还原命令,可以在网上找一找
我帮你在网上搜了一下
可以参考
备份
osql -Usa -Pxxx "bakeup database 数据库名 to disk= 'd:\yyy.bak'"
还原
osql -Usa -Pxxx "restore database 数据库名 from disk= 'd:\yyy.bak'"-------以下是网上搜索命令参考----------sqlserver有关的命令行就那几个命令 bcp,isql(不知道2005有吗) osql
2005还多了个sqlcmd
给你参考一下,xys_777的
SQL code
用sqlserver的sqlcmd、osql、isql的备份与还原
--sqlcmd ,sql2005新加工具
1、备份
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:\aa\aaa.bak'"
已为数据库 'test',文件 'test' (位于文件 2 上)处理了 176 页。
已为数据库 'test',文件 'test_log' (位于文件 2 上)处理了 1 页。
BACKUP DATABASE 成功处理了 177 页,花费 1.207 秒(1.201 MB/秒)。
2、还原
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:\aa\aaa.bak'"
3、帮助
C:\Documents and Settings\xuysh>"C:\Program Files\Microsoft SQL Server\90\Tools\
Binn\SQLCMD.EXE" -?
Microsoft (R) SQL Server 命令行工具
版本 9.00.1399.06 NT INTEL X86
版权所有 (c) Microsoft Corporation。保留所有权利。
用法: Sqlcmd [-U 登录 ID] [-P 密码]
[-S 服务器] [-H 主机名] [-E 可信连接]
[-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
[-h 标题] [-s 列分隔符] [-w 屏幕宽度]
[-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
[-c 命令结束] [-L[c] 列出服务器[清除输出]]
[-q "命令行查询"] [-Q "命令行查询" 并退出]
[-m 错误级别] [-V 严重级别] [-W 删除尾随空格]
[-u unicode 输出] [-r[0|1] 发送到 stderr 的消息]
[-i 输入文件] [-o 输出文件] [-z 新密码]
[-f | i:[,o:]] [-Z 新建密码并退出]
[-k[1|2] 删除[替换]控制字符]
[-y 可变长度类型显示宽度]
[-Y 固定长度类型显示宽度]
[-p[1] 打印统计信息[冒号格式]]
[-R 使用客户端区域设置]
[-b 出错时中止批处理]
[-v 变量 = "值"...] [-A 专用管理连接]
[-X[1] 禁用命令、启动脚本、环境变量[并退出]]
[-x 禁用变量情况]
[-? 显示语法摘要]
--Osql sql2000和sql2005都有
--1、备份
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\Osql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:\aa\aaa.bak'"
已为数据库 'test',文件 'test' (位于文件 3 上)处理了 176 页。
已为数据库 'test',文件 'test_log' (位于文件 3 上)处理了 1 页。
BACKUP DATABASE 成功处理了 177 页,花费 0.531 秒(2.730 MB/秒)。
2、还原
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\Osql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:\aa\aaa.bak'"
已为数据库 'test',文件 'test' (位于文件 1 上)处理了 176 页。
已为数据库 'test',文件 'test_log' (位于文件 1 上)处理了 2 页。
RESTORE DATABASE 成功处理了 178 页,花费 0.200 秒(7.255 MB/秒)。
3、帮助
C:\Documents and Settings\xuysh>"C:\Program Files\Microsoft SQL Server\90\Tools\
Binn\Osql.EXE" /?
Microsoft (R) SQL Server 命令行工具
版本 9.00.1399.06 NT INTEL X86
版权所有 (c) Microsoft Corporation。保留所有权利。
注意: osql 并不支持 SQL Server 2005的所有功能。
请使用 sqlcmd。有关详细信息,请参阅 SQL Server 联机丛书。
用法: osql [-U 登录 ID] [-P 密码]
[-S 服务器] [-H 主机名] [-E 可信连接]
[-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
[-h 标题] [-s 列分隔符] [-w 列宽]
[-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
[-L 列出服务器] [-c 命令结束] [-D ODBC DSN 名称]
[-q "命令行查询"] [-Q "命令行查询" 并退出]
[-n 删除编号方式] [-m 错误级别]
[-r 发送到 stderr 的消息] [-V 严重级别]
[-i 输入文件] [-o 输出文件]
[-p 打印统计信息] [-b 出错时中止批处理]
[-X[1] 禁用命令,[退出的同时显示警告]]
[-O 使用旧 ISQL 行为禁用下列项]
批处理
自动调整控制台宽度
宽消息
默认错误级别为 -1 和 1
[-? 显示语法摘要]
--Isql ,sql2000工具,2005中没有
--1、备份
"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\Isql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:\aa\aaa.bak'"
已为数据库 'test',文件 'test' (位于文件 3 上)处理了 176 页。
已为数据库 'test',文件 'test_log' (位于文件 3 上)处理了 1 页。
BACKUP DATABASE 成功处理了 177 页,花费 0.531 秒(2.730 MB/秒)。
2、还原
"C:\Program Files\Microsoft SQL Server\80\Tools\Binn\Isql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:\aa\aaa.bak'"
已为数据库 'test',文件 'test' (位于文件 1 上)处理了 176 页。
已为数据库 'test',文件 'test_log' (位于文件 1 上)处理了 2 页。
RESTORE DATABASE 成功处理了 178 页,花费 0.200 秒(7.255 MB/秒)。
3、帮助
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\xuysh>"C:\Program Files\Microsoft SQL Server\80\Tools\
Binn\Isql.EXE"/?
isql: unknown option ?
usage: isql [-U login id] [-P password]
[-S server] [-H hostname] [-E trusted connection]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w columnwidth]
[-a packetsize] [-e echo input] [-x max text size]
[-L list servers] [-c cmdend]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-n remove numbering] [-m errorlevel]
[-r msgs to stderr]
[-i inputfile] [-o outputfile]
[-p print statistics] [-b On error batch abort]
[-O use Old ISQL behavior disables the following]
batch processing
Auto console width scaling
Wide messages
default errorlevel is -1 vs 1
[-? show syntax summary (this screen)]
然后用b/s,再建一个tomcat应用,
备份恢复时 其他用户是不能使用系统的
存储过程就像相当于你在数据库建了一个方法,可以通过sql调用这个方法
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
end 在数据库的查询分析器里测试成功了,语句如下:use master exec killspid 'xinfadi_testDB'restore database xinfadi_testDB from disk='d:\\xinfadi.bak' with replace已为数据库 'xinfadi_testDB',文件 'xinfadi' (位于文件 1 上)处理了 557208 页。
已为数据库 'xinfadi_testDB',文件 'xinfadi_log' (位于文件 1 上)处理了 2 页。
RESTORE DATABASE 成功处理了 557210 页,花费 118.640 秒(36.692 MB/秒)。但是在程序中用java调用时,却出现异常,代码如下:String path = file.getPath() + "\\" + name + ".bak";// name文件名
String reSQL = "use master exec killspid 'xinfadi_testDB'restore database xinfadi_testDB from disk=? with replace"; // 还原数据库
PreparedStatement recovery = DataBaseUtil.getConnection()
.prepareStatement(reSQL); // 执行还原数据库
recovery.setString(1, path);
if (!recovery.execute())
over = "还原成功";
else
over = "还原失败";异常:
ERROR - Connection reset by peer: socket write error
Exception in thread "Timer-0" org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:627)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:913)
at com.once.xfd.hibernate.auction.service.AuctionBidService.findAuctionsToUnStart(AuctionBidService.java:433)
at com.once.xfd.hibernate.auction.service.AuctionBidService.saveAuctionStarting(AuctionBidService.java:477)
at com.once.xfd.daemon.auction.ComputeResultsTask.run(ComputeResultsTask.java:22)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2223)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:930)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 8 more
看你的错误提示,是Hibernate异常,你不用Hibernate,直接用jdbc试试
另外,存储过程调用,用CallableStatement试试
可以考虑把数据库备份处理写到一个批处理去,然后用java调用该批处理
http://www.minioa.net/viewtopic.php?f=13&t=112&p=167#p167