分类: 【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,然后再执行更新或者删除操作。

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

数据库同步和使用JSONObject让Java Bean“原地满状态复活”的更多相关文章

  1. 数据库和java Bean

    ·1. 数据库和java Bean,字段类型要一致.不一致查询不出来,但不会报错. 字段名称也一样,不一致查询不出来,但不会报错. 2. 数据库和java Bean字段的个数可以不一样,也不会包错 3 ...

  2. 用大白话聊聊JavaSE -- 如何理解Java Bean(一)

    首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...

  3. Java Bean、POJO、 Entity、 VO 、PO、DAO

    Java Bean.POJO. Entity. VO , 其实都是java 对象,只不过用于不同场合罢了.    Java Bean: 就是一个普通的Java 对象, 只不过是加了一些约束条件.  声 ...

  4. java bean、List、数组、map和Json的相互转化

    工程 json包为  代码 package com.my.json; public class ChildBean { private String childName; private String ...

  5. Servlet和JAVA BEAN 分析探讨

    在JSP中调用JAVA类和使用JavaBean有什么区别? 可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类.特殊在可以通过<jsp:useBean   />调用Jav ...

  6. 让你的代码量减少3倍!使用kotlin开发Android(三) 缩短五倍的Java Bean

    回顾一下 哈,没想到你已经坚持不懈看到第三篇了,不错哈~坚持就是胜利. 本文同步自博主的私人博客wing的地方酒馆 在上一篇文章中,我们介绍了扩展函数,这里对上一篇进行一点小小的补充. 还记得text ...

  7. Java bean 转 Map

    Java bean 转 Map 时需要使用Fastjson //方法 一 Map<String, Object> a = (Map<String, Object>)JSON.t ...

  8. mysql 表映射为java bean 手动生成。

    在日常工作中,一般是先建表.后建类.当然也有先UML构建类与类的层级关系,直接生成表.(建模)这里只针对先有表后有类的情况.不采用代码生成器的情况. 例如: 原表结构: ),)) BEGIN ); ) ...

  9. Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器-比lombok更符合需求

    builder模式在越来越多的项目中使用,类似于alibaba fastjson JSONObject.fluentPut(),调用一个方法后返回这个对象本身,特别适合构建一些参数超级多的对象,代码优 ...

随机推荐

  1. 【SSM 】导出excel含图片

    ExprotRentUtils package com.kikyo.stat.utils; import java.awt.image.BufferedImage; import java.io.By ...

  2. 树莓派4B踩坑指南 - (8)安装GO语言

    下载 191129最新版本为go1.13.4.linux-armv6l.tar.gz go官网(点此访问)国内访问似乎不是很稳定,但下载速度还挺快,下载地址:(点此访问) 安装 解压后是一个名为go的 ...

  3. 对FPM 模块进行参数优化!

    Nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可对FPM 模块进行参数跳转.FPM 优化参数:pm 使用哪种方式启动 fpm 进程,可以说 static ...

  4. Codeforces1140D. Minimum Triangulation

    题目链接 本题是区间dp里的三角剖分,板子题,dp[i][j]表示凸多边形i-j构成的最值,转移方程为dp[i][j] = min/max(dp[i][k]+dp[k][j]+w[i,j,k])(i& ...

  5. RestTemplate的异常 Not enough variables available to expand

    当使用 RestTemplate 可能会遇到异常: Not enough variables available to expand 典型如下: @Autowired private RestTemp ...

  6. redis实现哨兵机制

    将cd /usr/local/redis/sentinel.conf复制到/usr/local/redis/etc/下 cd /usr/local/redis/ cp sentinel.conf /u ...

  7. PTA的Python练习题(六)

    从 第3章-8 字符串逆序 开始 1. n = str(input()) n1=n[::-1] print(n1) 2. 不是很好做这道题,自己还是C语言的思维,网上几乎也找不到什么答案 s = in ...

  8. SOAP1.1 VS SOAP1.2

    SOAP提升: 目前WebService的协议主要有SOAP1.1和1.2.两者的命名空间不同. 见下页对比 SOAP1.1版本与SOAP1.2版本在头信息上存在差异.SOAP1.1存在SOAPAct ...

  9. git——解决每次拉取、提交代码时都需要输入用户名和密码

    在开发中我们经常需要通过 git 对代码进行拉取和提交,频繁地输入用户名和密码会带来很大的麻烦,下面就介绍一下解决git每次拉取.提交代码时都需要输入用户名和密码的方法. 很简单,只要两步骤就能实现: ...

  10. IELTS Simon wr task p3