数据库同步和使用JSONObject让Java Bean“原地满状态复活”

分类: 【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

[java] view plaincopy

  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:    [email protected]
  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

[java] view plaincopy

  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:    [email protected]
  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,然后再执行更新或者删除操作。

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

时间: 2024-08-07 15:09:14

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

Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作

正如前面一篇文章的介绍,当使用Servlet提交表单和JSP数据库查询时,总是相互交叉着的处理,要么在JSP中通过<%...%>内嵌Java代码操作数据库,要么JSP中通过Post方法提交表单Form,在Java中通过Servlet获取请求/响应,再通过Java中out.println("<HTML>...")输出数据库中值. 此篇文章主要讲述通过DAO和Java Bean操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.参考前文: Java+My

MySQL数据库同步小工具(Java实现)

近期公司做个报表系统,为了报表系统中复杂的查询条件,不影响线上业务系统的使用,研究了一下MySQL数据库同步,下面用Java代码实现MySQL数据库同步,以便自己查阅! ? 数据库同步实现功能点: 1.支持跨服务器跨库的多线程同步 2.每张表的同步有日志记录 3.每次同步记录数可配置 源码和具体的使用细则,可以到下载源码及使用说明?. ? 一.数据同步核心代码 ? ? ? 二.数据库同步多线程实现 ? ? ? ? 三.配置文件及读取配置文件代码 配置文件内容为: 读取配置文件的Java类为: ?

数据库和java Bean

·1. 数据库和java Bean,字段类型要一致.不一致查询不出来,但不会报错. 字段名称也一样,不一致查询不出来,但不会报错. 2. 数据库和java Bean字段的个数可以不一样,也不会包错 3.会报错的,如果用到BeanUtils.populate()方法,前端input标签里的name名称,要和java bean中字段名称一样 原文地址:https://www.cnblogs.com/hyjh/p/11509189.html

java数据库执行迁移报错Error creating bean with name &#39;flywayInitializer&#39; defined in class path resource

报错原因 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocati

SymmetricDS 异构数据库同步软件部署案例

SymmetricDS是一个开源的同步软件,该软件是基于java环境编写的,在运行的时候需要安装JDK.SymmetricDS可以同步文件和数据库,本文的重点是数据库方面的同步. SymmetricDS支持多种数据库的同步,支持的数据库如下: Oracle, MySQL, MariaDB, PostgreSQL, MS SQL Server (including Azure), IBM DB2, H2, HSQLDB, Derby, Firebird, Interbase, Informix,

java 编程思想 22.11: java bean 案例代码

java 编程思想  22.11:   java bean 案例代码 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.swing.bean; import java.awt.Color; import java.awt.event.ActionListener; import java.awt.event.KeyListener; import org.rui.

一个强大易用的java bean之间属性复制框架--Dozer介绍

Dozer is a Java Bean to Java Bean mapper that recursively copies data from one object to another. Typically, these Java Beans will be of different complex types. 更多内容见:http://dozer.sourceforge.net/documentation/about.html 两个简单示例: map --> bean假设由reque

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

Java Bean.POJO. Entity. VO , 其实都是java 对象,只不过用于不同场合罢了. Java Bean: 就是一个普通的Java 对象, 只不过是加了一些约束条件.  声明的 property 是 private 的, 并且,实现了 Get 和set 方法. POJO:  Plain Old Java  Object . 一个普通的对象而已: Entity: 实体的意思. 在访问数据库时,才声明 Entity. 说白了, 一个Entity 就是对应表中的一条记录. 当 i

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

工程 json包为  代码 package com.my.json; public class ChildBean { private String childName; private String childSex; private int childAge; public ChildBean() { } public ChildBean(String childName, String childSex, int childAge) { this.childName = childName