分类: 【java】2013-11-28 21:04 729人阅读 评论(0) 收藏 举报
简介
我为什么写这样一个简单的问题呢?首先介绍一下项目背景。最近需要做一个数据库同步的工作,也就是一个Web程序有两个数据库,一个是它自身的本地数据库,另外一个是远程的数据库。当我们对访问web项目,对其本地数据库进行增删改的时候,也要同时对远程数据库进行增删改。我们的思路是:我们首先在Spring的配置文件中,注入两个Dao对象,然后在service层进行增删改的时候,会在BaseDao中先调用本地数据库的dao,然后调用远程的dao。

关键问题:

当本地的数据库增删改成功,而远程数据库增删改失败的时候,我们就需要对其进行异常处理。我们需要将增删改的对象保存起来然后插入到本地的同步表当中,当远程数据库可访问的时候,然后再将本地同步表中的数据取出来,然后生成对应的Object对象,然后使用远程数据库的dao进行增删改,增删改之后再将本地数据库的同步表记录删除。

前提:
1.系统之前已经开发完毕,没有数据库同步功能
2.系统使用ssh框架开发
3.系统的所有增删改都是有service层调用Dao层的Hibernate方法实现的
疑问:
1.同步的时候为什么不在每个service层修改?
对于一个相对庞大的系统,service层有很多类,如果一个service一个service修改,工作了太大,容易改错
2.为什么不在数据库中添加一个字段,标记该条数据是否同步?
系统有几十张数据库表,这样做的话,代码修改了过大
3.如何设计同步表,如何根据同步表的内容对,进行同步?
同步表的设计
create table synctbl(
  id varchar2(26) primary key,
  type varchar2(10) not null,
  classname varchar2(128) not null,
  syncstring varchar2(3000) not null,
  createtime date
);
id;主键,UUID即可
type:操作类型(增、删、改,或者hql语句)
classname:数据库表对于的Hibernate实体类的类名
syncstring:进行增删改的对象的序列化字符串,或者hql语句
createtime:该条记录的生成时间
正文:
以上逻辑有点复杂,很难用简短的文字描述清楚。我就把如何使用JSONObject让Hibernate的实体类生成字符串,然后在恢复的时候又是如何根据这些字符串和实体类的名称恢复出该实体类。
使用JSONObject需要如下jar包。
1.commons-beanutils-1.7.0.jar
2.commons-collections-3.2.jar
3.commons-lang-2.3.jar
4.commons-logging-1.0.4.jar
5.ezmorph-1.0.6.jar
6.json-lib-2.1.jar

然后我们创建一个Java Project来演示:

项目源代码:https://github.com/nuptboyzhb/JavaJsonObjectBean

  1. /*
  2. * $filename: TestMain.java,v $
  3. * $Date: 2013-11-28  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import net.sf.json.JSONObject;
  11. /*
  12. *@author: ZhengHaibo
  13. *web:     http://blog.csdn.net/nuptboyzhb
  14. *mail:    zhb931706659@126.com
  15. *2013-11-28  Nanjing,njupt,China
  16. */
  17. public class TestMain {
  18. /**
  19. * @param args
  20. */
  21. public static void main(String[] args) {
  22. // TODO Auto-generated method stub
  23. BeanModel saveBeanModel = getInitBean();
  24. String clazzType = saveBeanModel.getClass().getName();
  25. String jsonString = JSONObject.fromObject(saveBeanModel).toString();
  26. printObject(saveBeanModel);//先打印一下看看
  27. ////////////////我们可以通过clazzType和jsonString,在程序中重新生成saveBeanModel对象
  28. JSONObject jsonObject = JSONObject.fromObject(jsonString);
  29. try {
  30. Object object = JSONObject.toBean(jsonObject, Class.forName(clazzType));
  31. /////////////////////此时的object就是我们由clazzType和jsonString两个属性恢复出的对象
  32. printObject(object);
  33. } catch (ClassNotFoundException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. }
  38. public static BeanModel getInitBean(){
  39. List<BeanModel> list = new ArrayList<BeanModel>();
  40. for(int i = 0;i<10;i++){
  41. BeanModel beanModel = new BeanModel();
  42. beanModel.setDate(new java.util.Date());
  43. beanModel.setId(i);
  44. beanModel.setName("name"+i);
  45. }
  46. BeanModel saveBeanModel = new BeanModel();
  47. saveBeanModel.setId(11);
  48. saveBeanModel.setDate(new java.util.Date());
  49. saveBeanModel.setName("saveBean");
  50. saveBeanModel.setList(list);
  51. return saveBeanModel;
  52. }
  53. public static void printObject(Object object){
  54. String result = JSONObject.fromObject(object).toString();
  55. System.out.println("结果:"+result);
  56. }
  57. }

BeanModel.java

  1. /*
  2. * $filename: BeanModel.java,v $
  3. * $Date: 2013-11-28  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb;
  8. import java.util.Date;
  9. import java.util.List;
  10. /*
  11. *@author: ZhengHaibo
  12. *web:     http://blog.csdn.net/nuptboyzhb
  13. *mail:    zhb931706659@126.com
  14. *2013-11-28  Nanjing,njupt,China
  15. */
  16. public class BeanModel {
  17. private Integer id;
  18. private Date date;
  19. private String name;
  20. private List<BeanModel> list;
  21. public Integer getId() {
  22. return id;
  23. }
  24. public void setId(Integer id) {
  25. this.id = id;
  26. }
  27. public Date getDate() {
  28. return date;
  29. }
  30. public void setDate(Date date) {
  31. this.date = date;
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. public List<BeanModel> getList() {
  40. return list;
  41. }
  42. public void setList(List<BeanModel> list) {
  43. this.list = list;
  44. }
  45. }

注意:对于我们“恢复”的对象,我们可以使用Hibernate的getCurrentSession进行保存操作。但是,如果使用getCurrentSession来更新或删除这个对象,那么Hibernate就会报错。此时,我们需要使用Hibernate的sessionFactory.openSession方法,获得Session,然后再执行更新或者删除操作。

未经允许不得用于商业目的

最新文章

  1. jdbc java数据库连接 10)批处理
  2. Spring源码分析——BeanFactory体系之抽象类、类分析(二)
  3. JS中的属性和变量的区别
  4. nullcon HackIM 2016 -- Crypto Question 2
  5. JAVA RMI例子
  6. oracle的基本查询~上
  7. HTTP状态代码
  8. 【BZOJ1012】【JSOI2008】最大数
  9. C++中的Overload、Override和Overwrite
  10. poj 3067 Japan(线段树?,神奇卡时代码,暂未完)
  11. 深入理解Binder(二),Binder是什么?
  12. 实现C++模板类头文件和实现文件分离的方法
  13. 跨越多台haproxy 跳转
  14. sublime text 插件开发
  15. Android Security
  16. Cosmos OpenSSD--greedy_ftl1.2.0(二)
  17. [BZOJ1707] [Usaco2007 Nov] tanning分配防晒霜 (贪心)
  18. sql面试 查找每个班级的前5名学生(取分类数据的前几条数据)
  19. C#UDP广域网,局域网通信-原理分析
  20. 【C++】 多态的实现和原理

热门文章

  1. 最全BT磁力搜索引擎索引(整理分享,每日更新)
  2. python requirements.txt批量下载安装离线
  3. Practical aspects of deep learning
  4. 解决idea创建maven项目无java
  5. nginx 的提升多个小文件访问的性能模块
  6. MySQL之innodb和myisam的区别
  7. navicat12破解详细教程
  8. 【原】Linux中常见服务介绍
  9. Java记录4--string
  10. ie9下浏览器 cosole.log()会阻止j下面的s加载