java实现数据库同步

java 数据库同步 db2 it

这里实现方式事先说明下,采用json+文本流方式,即读取数据库信息至文本流中,格式采用json,之后读取文本中json数据至数据库中,实现度还不完全,不过也提供了一种解决方案,目前可支持同类型数据库表同步,使用后可根据个人需要进行不同表数据库同步进行修改,仅贡献个人代码给各位大神。

再次说明下由于各个数据库中关于数字的类型可能有所不同,所以这里提供了一个db2拓展实现作为demo,其他数据库可以效仿。

public abstract class DBTools {
 protected Connection conn = null;

 protected Statement stmt = null;

 protected ResultSet rs = null;

 protected String username;// 数据库用户名

 protected String password;// 数据库密码

 protected String dbname;// 数据库名称

 // 数据库中的数字域
 protected List numList = new ArrayList();

 
 protected boolean connectDB(String dbname, String user, String password)
   throws Exception {

  // 加载驱动程序以连接数据库
  try {

   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   conn = DriverManager.getConnection("jdbc:odbc:" + dbname, user,
     password);
   // url = "jdbc:db2:njtcdata";
  }
  // 捕获加载驱动程序异常
  catch (ClassNotFoundException cnfex) {
   System.err.println("装载JDBC驱动程序失败。");
   cnfex.printStackTrace();
   return false;

  }
  // 捕获连接数据库异常
  catch (SQLException sqlex) {
   System.err.println("无法连接数据库");
   sqlex.printStackTrace();
   // System.exit(1); // terminate program
   return false;
  }
  return true;
 }

 protected int executeSQL(String sql) throws SQLException {
  System.out.println(sql);
  return stmt.executeUpdate(sql);

 }

 protected ResultSet query(String sql) throws Exception {
  // 先打印出SQL
  System.out.println(sql);
  try {
   Statement stmt = conn.createStatement(
                    ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
   rs = stmt.executeQuery(sql);
  } catch (Exception e) {
   e.printStackTrace();
   throw new Exception("执行查询语句错误!", e);
  }
  return rs;
 }

 protected void colseConnect() throws Exception {
  if (stmt != null)
   stmt.close();
  if (conn != null)
   conn.close();
  if (rs != null)
   rs.close();
  // conn.close();
 }

 protected String createFilePath() {
  Date dt = new Date();
  SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd-hh-mm-sss");
  String filename = System.getProperty("user.dir") + "\\src\\"
    + sf.format(dt) + ".txt";
  return filename;
 }

 
 protected String generalInsertSQL(String table, JSONObject jobject,
   JSONArray columns) throws JSONException {
  StringBuffer sb = new StringBuffer();
  sb.append("insert into " + table + "(");
  for (int i = 0; i < columns.length(); i++) {
   JSONObject jcolumn = columns.getJSONObject(i);
   String column = jcolumn.getString("COLNAME");
   sb.append(column);
   if (i != columns.length() - 1) {
    sb.append(",");
   }
  }
  sb.append(") values(");
  for (int i = 0; i < columns.length(); i++) {
   JSONObject jcolumn = columns.getJSONObject(i);
   String column = jcolumn.getString("COLNAME");
   String typecolumn = jcolumn.getString("TYPENAME");
   String datacolumn = jobject.getString(column) .equals("null") ? null :jobject.getString(column);
   
   if(datacolumn == null)
   {
    sb.append("null");
   }else if (numList.contains(typecolumn)) {
    // 是数字域
    sb.append(datacolumn);
   } else {
    // 文本域或者日期域
    sb.append("'" + datacolumn + "'");
   }

   if (i != columns.length() - 1) {
    sb.append(",");
   }
  }
  sb.append(")");
  return sb.toString();
 }

 
 protected String generalTextSQL(JSONArray columns, String tablename,
   String condition) throws JSONException {
  StringBuffer sb = new StringBuffer();
  sb.append("select ");
  for (int i = 0; i < columns.length(); i++) {
   JSONObject jcolumn = (JSONObject) columns.get(i);
   String column = jcolumn.getString("COLNAME");
//   String strColumn = "case when " + column
//     + " is null then '' else char(" + column + ") end  as "
//     + column;
   String strColumn = column;
   sb.append(strColumn);
   if (i != columns.length() - 1) {
    sb.append(" ,");
   }
  }
  sb.append("  from  " + tablename);
  if (!condition.equals("")) {
   // 添加控制条线
   sb.append(" where " + condition);
  }
  return sb.toString();
 }

 
 public String readToFile(String table, String condition) throws Exception {
  String path = createFilePath();
  File file = new File(path);

  JSONArray columns = queryTableColumns(table);
  if (columns == null) {
   // 读取表失败
   System.out.println("读取表失败");
   return null;
  }
  String sql = generalTextSQL(columns, table, condition);
  
  ResultSet rs = query(sql);
  FileOutputStream fout = new FileOutputStream(file);
  System.out.println("开始读取表到文件中...");
  int index = 0;
  fout.write("[".getBytes());
  while (rs.next()) {
   StringBuffer sb = new StringBuffer();
   sb.append("{");
   for (int i = 0; i < columns.length(); i++) {
    JSONObject jcolumn = (JSONObject) columns.get(i);
    String column = jcolumn.getString("COLNAME");
    String columndate = rs.getString(column);

    String addDateStr = "\"" + column + "\":\"" + columndate + "\"";

    sb.append(addDateStr);
    if (i != columns.length() - 1) {
     sb.append(",");
    }
   }
   if(rs.isLast())
   {
    sb.append("}");
   }else{
    sb.append("},");
   }
   fout.write(sb.toString().getBytes());
   index++;
  }
  fout.write("]".getBytes());
  System.out.println("读取完毕!");
  System.out.println("读取总数据量为:"+index+"条!");
  System.out.println("文件路径为!");
  System.out.println(path);
  return path;
 }

 
 public boolean readToDatabase(String table, String filePath) throws Exception
 {

  JSONArray columns = queryTableColumns(table);
  if (columns == null) {
   // 读取表失败
   return false;
  }
  // 先打印出SQL

  try {
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   System.out.println("开始读取文件...");

   File file = new File(filePath);
   FileInputStream filein = new FileInputStream(file);

   byte[] in = new byte[999];
   byte temp ;
   int index = 0;
   while ((temp = (byte) filein.read()) != -1 )
   {
    if(temp == 123)
    {
     //{
     index = 0;
     in[index++] = temp;
    }else if(temp == 125)
    {
     //}
     in[index++] = temp;
     String str = new String(in, "gbk");
     JSONObject jobject = new JSONObject(str);

     String insertSQL = generalInsertSQL(table, jobject, columns);

     System.out.println(insertSQL);
     stmt.executeUpdate(insertSQL);
     //重新更新in内存
     in = null;
     in = new byte[999];
    }else
    {
     in[index++] = temp;
     
    }
    
   }
   System.out.println("读取文件完毕");
   System.out.println("开始插入数据库...");
   conn.commit();
   System.out.println("插入数据库完毕!");
  } catch (Exception e) {
   try {
    conn.rollback();
   } catch (SQLException e2) {
    // TODO Auto-generated catch block
    e2.printStackTrace();
   }
   e.printStackTrace();
   try {
    throw new Exception("执行查询语句错误!", e);
   } catch (Exception e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
  }
  return true;
 }
 
 
 public abstract JSONArray queryTableColumns(String table) throws Exception;
}public class TestTransDB2 extends DBTools{
 
 public TestTransDB2(String dbname,String username,String password)
 {
  numList.add("INTEGER");
  numList.add("DECIMAL");
  this.dbname = dbname;
  this.username = username;
  this.password = password;
  try {
   connectDB(dbname, username, password);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public JSONArray queryTableColumns(String table) throws Exception {
  // 检验表名是否存在
  String sql = "Select COLNAME,TYPENAME from SYSCAT.COLUMNS WHERE TABNAME='"+table+"' order by COLNO";
  //System.out.println(sql);
  Statement stmt = conn.createStatement();
  rs = stmt.executeQuery(sql);
  JSONArray result = new JSONArray();
  
  while(rs.next())
  {
   JSONObject jobject = new JSONObject();
   String COLNAME = rs.getString("COLNAME").toString();
   String TYPENAME = rs.getString("TYPENAME").toString();
   jobject.put("COLNAME", COLNAME);
   jobject.put("TYPENAME", TYPENAME);
   
   result.put(jobject);
  }
  if(result.length() == 0)
  {
   return null;
  }else
  {
   return result;
  }
 }
}


相关推荐

  • javaEE MOUDL1连接数据库实现实现增删改查 开心啊终于可以连接数据库了,一直想看看连接数据库是什么样子的,今天终于实现了。java部分我们需要数据库存储的对象(老师)就是领域模型也叫VO一个TeacherDao接口,一个TeacherDaoImpl(Dao设计模式),ResultSe
  • C#远程存取Access数据库实现方法 目前,基于数据库服务器的桌面管理程序和Web程序已经有太多的应用了,尤其是网络的大量普及,孤立地数据库管理系统无法胜任分布式管理应用,但是面对基于Access数据库的现有的桌面应用我们也无法完全的摒弃。我们利用.Net远程处理功能将连接和存
  • 数据库实现收藏功能 http://www.open-open.com/code/view/1437357896303使用sqlite可以实现简单的收藏夹功能,不多说直接上代码。1.首先导入libsqlite3.0.dylib,libz.dylib两个类库2.封
  • Unity3dz直接链接MySQL数据库实现登录功能 关键dll:MySql.Data.dll,System.Data.dll,System.Drawing.dll​其它dll:I18N.CJK.dll,I18N.dll,I18N.West.dll​E:\Unity\E
  • Sql Server 2008 R2数据库之复制同步数据 对于数据库的复制功能一直也没有用过,正好这次需要做数据库之间的数据同步,就把数据库复制同步整理了一下。数据库同步可以是同一个服务器之间不同数据库之间数据同步,也可以是局域网内不同服务器间数据库的同步。因为这次做的就是局域网内两台服务器上数据
  • 线程同步的多种实现 线程同步的多种实现AutoResetEventAutoResetEvent允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源(MSDN)访问完独占资源后的线程,通过发送信号通知其它等待线程可以开始抢占资源了,最终已独占的形式
  • 基于嵌入式Linux移动数据同步研究与实现 基于嵌入式Linux移动数据同步研究与实现3A学习网-九年学习资料成功运营,汇聚97.1W套论文资料实力与承诺1、售前查询、售后登记。保证唯一!(全省保证唯一!)2、九年论文服务成功运营信誉保证(2003年—2012年)3、完善的售后服务-
  • 通过 Delphi实现 Java调用 Oracle数据库数据 推荐文章Page1通过Delphi实现Java调用Oracle数据库数据----在开发WWW网络浏览软件中,时常要用到JAVA画一些生产管理图形,而且大量的图形数据存于网络数据库ORACLE中,现在常用的方法是使用JDBC来实现对数据库的操
  • [置顶] Oracle如何实现两个数据库的同步(用实体化视图实现)(oracle快照实例) 一、技术实现细节除非特别说明,下面的SQL命令都是在数据库ora_db2的SYSETM用户下运行的。假设要复制(或同步)另一服务器上数据库ora_db1中用户db1的所有表。1.创建一个用于连接数据库1(ora_db1)的数据库连接(dbl
  • MySQL数据库中,将一个库的数据同步到另一个库 将一个数据库里的数据同步到另一个数据库中,用脚本执行。这里演示的是从MySQL的一个数据库ceshiqlone的表tab_wzc1同步到yw库中(同一台主机)(也可以在不同主机,只是需要SSH),不同的数据库可能表结构等因素不同,不能用这个
  • 通过 Delphi实现 Java调用 Oracle数据库数据 推荐文章设计模式之Singleton(单态)J2ME编程中时间处理全攻略编程修养(5)学习GoF设计模式的重要性Page1通过Delphi实现Java调用Oracle数据库数据----在开发WWW网络浏览软件中,时常要用到JAVA画一些生产
  • 本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法。分享给大家供大家参考。具体实现方法如下  http://www.jb51.net/article/60756.htm本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法。分享给大家供大家参考。具体实现方法如下:第一种方法:大致方法就是,从数据库中读出Blob

你的评论

就没有什么想说的吗?

最新博客

关于我们 免责声明 移动版

©2017传客网    琼ICP备15003173号-2    

本站部分文章来源于互联网,版权归属于原作者。
本站所有转载文章言论不代表本站观点,如是侵犯了原作者的权利请发邮件联系站长(weishubao@126.com),我们收到后立即删除。
站内所有资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己承担!

X