java 实现数据库服务器之间的数据传输.docx_第1页
java 实现数据库服务器之间的数据传输.docx_第2页
java 实现数据库服务器之间的数据传输.docx_第3页
java 实现数据库服务器之间的数据传输.docx_第4页
java 实现数据库服务器之间的数据传输.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java 实现两个数据库服务器之间的数据传输,我使用的是数据库的备份和恢复功能。如图1所示,A机器上的数据库信息传到B机器上。其实没必要用一个系统实现,可以直接到A机器上导出数据库,比如XX.sql、XX.dmp、XX.MDF等等文件,传入到B机器上导入就可以。但是一般客户不知道数据库导入导出命令,需要给个界面化操作。界面上需要的填入的信息大概就是A、B机器数据库的数据库名称、IP、端口、用户名、密码等信息。前几天帮同学完成这功能之后,一个公司也可以开发这样的一个系统,将所有数据库导入导出集成到系统中,发布到公司的内网上,供公司人员使用也不错的。图1 废话不多说了,就实现上面的功能,下面给出mysql例子。 原理比较简单,通过客户端访问OA系统,填入必要的信息之后,将信息传入C服务器处理,在C机器上取得A数据库信息,然后将A数据库信息在C服务器上恢复到B上。如图2所示,这些是我需要的数据库信息。图2 首先,备份A机器上的MySql数据库信息:备份恢复mysql数据库需要用到mysqldump和mysql命令,这需要我们指定他们的exe执行文件。有两种修改方案,一种修改环境变量的path变量,编辑path变量,在它的变量值中添加mysql安装路径bin目录下(C:Program FilesMySQLMySQL Server 5.0bin),另一种在使用备份恢复命令时直接具体的路径:C:Program FilesMySQLMySQL Server 5.0binmysqldump。下面给出主要方法:/* * Function Name: bakMysql * Description: 备份mysql数据库 * Date Created: Oct 27, 2011 8:57:05 PM * param : dbName 数据库名称,tableNames 备份的数据表名称(多张表以逗号分隔),ip * 需要备份的数据库地址,username 用户名,password 密码 ,dbFilePath 临时目录 * Author: Li Qing * Last Modified: , Date Modified: */public boolean bakMysql(String dbName, String tableNames, String ip,String username, String password, String dbFilePath) / 备份命令,可以分两种情况考虑,如果只备份整个数据库,那么表tableNames为空,这时备份整个数据库,如果tableNames有值,这里就备份某一张或者多张表 String bakComand = mysqldump + -h + ip + -u + username+ -p + password + -set-charset=utf-8 + dbName + + tableNames;try Runtime rt = Runtime.getRuntime();Process p = rt.exec(cmd /c + bakComand); / 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。 InputStream inStream = p.getInputStream(); / 设置输出流编码为utf8。这里必须是utf8,否则从流中读入的是乱码 InputStreamReader ins= new InputStreamReader(inStream, utf-8); /每行数据 String inStr; StringBuffer sb = new StringBuffer(); / 组合控制台输出信息字符串BufferedReader br = new BufferedReader(ins); /读取控制台信息 while (inStr = br.readLine() != null) /添加到sb变量中 sb.append(inStr + rn); / 要用来做导入用的sql目标文件: FileOutputStream fout = new FileOutputStream(dbFilePath); /指定字符集utf-8OutputStreamWriter writer = new OutputStreamWriter(fout, utf8); /写sb到文件中 writer.write(sb.toString(); / 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免 writer.flush(); / 关闭输入输出流 inStream.close();ins.close(); br.close(); writer.close(); fout.close(); catch (Exception e) e.printStackTrace(); return false; return true; 其次,在做恢复操作之前,删除需要恢复的数据库或者表名,删除之后,再创建新的数据库,然后进行导入操作。分两种情况,一种导入整个数据库(即恢复整个数据库),只要求对整个数据库全部删除。一种是只需导入一张或者多张表信息,要求只删除某个需要导入数据的表信息。先用JDBC连接B数据库服务器,然后对其进行操作:(如果没有这一步,在导入数据的时候可能会出错)/* * throws SQLException * Function Name: dropAndCreateDatabase * Description: 删除原有数据库并新建数据库 * param :url 数据库地址,user 用户名,password 密码,dropDBSql * 删除数据库sql语句(可以为空),createDBSql 创建数据库信息(可以为空),delTablesSql * 删除数据表sql语句(可以为空) * Date Created: Oct 27, 2011 8:57:05 PM * Author: Li Qing * Last Modified: , Date Modified: */private boolean dropAndCreateDatabase(String url, String user,String password,StringdropDBSql,StringcreateDBSql,StringdelTablesSql) throws SQLException / 定义con变量 java.sql.Connection con = null; / 定义stmt变量 java.sql.Statement stmt = null; try / mysql驱动 Class.forName(com.mysql.jdbc.Driver); catch (java.lang.ClassNotFoundException e) / 不能发现JDBC驱动,返回false; return false; try / 连接数据库 con = DriverManager.getConnection(url, user, password); stmt = con.createStatement(); / 如果dropDBSql不为空,删除数据库信息 if (!.equals(dropDBSql) / 删除数据库信息 stmt.executeUpdate(dropDBSql); / 如果createDBSql不为空,创建数据库 if (!.equals(createDBSql) / 创建数据库 stmt.executeUpdate(createDBSql); / 如果delTablesSql不为空,删除表信息 if (!.equals(delTablesSql) / 删除表 stmt.executeUpdate(delTablesSql); catch (SQLException ex) / 操作数据库出错,返回false return false; finally / 关闭con if (con != null) con.close(); / 关闭stmt if (stmt != null) stmt.close(); return true; 最后恢复一下sql文件,主要代码如下:/* Name: restoreMysql : 恢复mysql数据库 :dbName 数据库名称,ip 导入服务器地址,username 服务器用户名,password 服务器密码,dbFilePath sql文件具体路径 Created: Oct 27, 2011 8:57:05 PM : Li Qing Modified: , Date Modified: */public boolean restoreMysql(String dbName, String ip,String username, String password, String dbFilePath) /恢复命令 String restoreComand= mysql +-h+ip+ -u+username+ -p+password+ +dbName; try /判断恢复文件是否存在 if(!new File(dbFilePath).exists() /返回false return false; /执行恢复命令 Process p = Runtime.getRuntime().exec(cmd /c +restoreComand); /取得输出流作为文件的输入流 OutputStream out = p.getOutputStream(); /读取文件信息 InputStream inStream=new FileInputStream(dbFilePath); int length=1024; byte bytes=new bytelength;/写字节流 int readcount=0; /写数据 while(readcount=inStream.read(bytes)!=-1) if(readcountlength) out.write(bytes,0,readcount); else out.write(bytes); /关闭流 inStream.close(); out.close(); p.waitFor(); catch (Exception e) return false; return true; 以上可以实现A、B服务器之间数据库传输,只要局域网相通,任意的两个服务器数据都是相通的。 Oracle数据库传送原理相同。从A服务器上导出数据库信息的命令语句为exp tables=(table) full=y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论