标签:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://enetq.blog.51cto.com/479739/878372
Java项目中调用bat批处理配合使用BCP进行多用户数据的备份
一、项目需求
最近项目中需要对数据库(Sql Server系列数据库)进行备份。项目中的需求不是简单的整个数据库的备份,而是根据用户来备份,具体的备份策略如下:
①系统为某一赛事管理类型的系统,整个系统分为几部分,前半部分的处理是在服务器上处理,后半部分的处理,是在用户自己的客户端中处理。不同的赛事对应不同的用户,用户将需要的数据提交给系统进行处理。
②系统在处理完数据之后,用户可以导出自己赛事相关的数据了,这个导出实际上做的就是个备份数据库,只不过只备份属于自己的数据库。然后下载系统的处理结果,很显然,各个用户的数据是不相同的。
③用户下载自己备份的数据库文件(这些个文件会打包成zip压缩包),再导入自己的客户端系统中。
整个系统使用的关键是:程序中调用bcp命令的时候传递用户相关的参数过去就OK了。处理流程如图1-1所示:
图1-1 处理流程
二、解决方案
本文提出的是使用Runtime.getRuntime().exec()调用批处理文件,程序中传递相关参数给bcp命令。关于BCP命令的详解,微软的MSDN上面写的非常的详细,在此就不赘述了!下面的一段话引用自微软的msdn上面的一段介绍:
bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。除非与 queryout 选项一起使用,否则使用该实用工具不需要了解 Transact-SQL 知识。若要将数据导入表中,必须使用为该表创建的格式文件,或者必须了解表的结构以及对于该表中的列有效的数据类型。
三、系统的实现
实现主要分为批处理文件的编写和Java程序中的调用两部分,这两部分完成之后,第一部分中的后续问题就好解决了。
①批处理编写:
编写的批处理文件如下,也就是使用bcp工具来进行备份
这里只列出部分表,代码都是一样的,使用的时候稍微修改下即可!@Title 根据userId导出的表 @bcp "SELECT * FROM sportSys.dbo.competitions where sportSys.dbo.competitions.userId="+%1 queryout %2competitions.xls -T -c >>%3log.txt @echo competitions表备份已完成!>>%3log.txt @bcp "SELECT * FROM sportSys.dbo.item where sportSys.dbo.item.userId="+%1 queryout %2item.xls -T -c >>%3log.txt @echo item表备份已完成!>>%3log.txt @bcp "SELECT * FROM sportSys.dbo.itemType where sportSys.dbo.itemType.userId="+%1 queryout %2itemType.xls -T -c >>%