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

简介:     分类: 【java】2013-11-28 21:04 729人阅读 评论(0) 收藏 举报 简介我为什么写这样一个简单的问题呢?首先介绍一下项目背景。最近需要做一个数据库同步的工作,也就是一个Web程序有两个数据库,一个是它自身的本地数据库,另外一个是远程的数据库。
 

 

分类: 【java】
简介
我为什么写这样一个简单的问题呢?首先介绍一下项目背景。最近需要做一个数据库同步的工作,也就是一个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 plain copy 在CODE上查看代码片 派生到我的代码片
 
  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.   
  9. import java.util.ArrayList;  
  10. import java.util.List;  
  11.   
  12. import net.sf.json.JSONObject;  
  13.   
  14. /* 
  15.  *@author: ZhengHaibo   
  16.  *web:     http://blog.csdn.net/nuptboyzhb 
  17.  *mail:    zhb931706659@126.com 
  18.  *2013-11-28  Nanjing,njupt,China 
  19.  */  
  20. public class TestMain {  
  21.   
  22.     /** 
  23.      * @param args 
  24.      */  
  25.     public static void main(String[] args) {  
  26.         // TODO Auto-generated method stub  
  27.         BeanModel saveBeanModel = getInitBean();  
  28.         String clazzType = saveBeanModel.getClass().getName();  
  29.         String jsonString = JSONObject.fromObject(saveBeanModel).toString();  
  30.         printObject(saveBeanModel);//先打印一下看看  
  31.         ////////////////我们可以通过clazzType和jsonString,在程序中重新生成saveBeanModel对象  
  32.         JSONObject jsonObject = JSONObject.fromObject(jsonString);  
  33.         try {  
  34.             Object object = JSONObject.toBean(jsonObject, Class.forName(clazzType));  
  35.             /////////////////////此时的object就是我们由clazzType和jsonString两个属性恢复出的对象  
  36.             printObject(object);  
  37.         } catch (ClassNotFoundException e) {  
  38.             // TODO Auto-generated catch block  
  39.             e.printStackTrace();  
  40.         }  
  41.     }  
  42.     public static BeanModel getInitBean(){  
  43.         List<BeanModel> list = new ArrayList<BeanModel>();  
  44.         for(int i = 0;i<10;i++){  
  45.             BeanModel beanModel = new BeanModel();  
  46.             beanModel.setDate(new java.util.Date());  
  47.             beanModel.setId(i);  
  48.             beanModel.setName("name"+i);  
  49.         }  
  50.         BeanModel saveBeanModel = new BeanModel();  
  51.         saveBeanModel.setId(11);  
  52.         saveBeanModel.setDate(new java.util.Date());  
  53.         saveBeanModel.setName("saveBean");  
  54.         saveBeanModel.setList(list);  
  55.         return saveBeanModel;  
  56.     }  
  57.     public static void printObject(Object object){  
  58.         String result = JSONObject.fromObject(object).toString();  
  59.         System.out.println("结果:"+result);  
  60.     }  
  61.   
  62. }  

BeanModel.java

 

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  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.   
  9. import java.util.Date;  
  10. import java.util.List;  
  11.   
  12. /* 
  13.  *@author: ZhengHaibo   
  14.  *web:     http://blog.csdn.net/nuptboyzhb 
  15.  *mail:    zhb931706659@126.com 
  16.  *2013-11-28  Nanjing,njupt,China 
  17.  */  
  18. public class BeanModel {  
  19.     private Integer id;  
  20.     private Date date;  
  21.     private String name;  
  22.     private List<BeanModel> list;  
  23.     public Integer getId() {  
  24.         return id;  
  25.     }  
  26.     public void setId(Integer id) {  
  27.         this.id = id;  
  28.     }  
  29.     public Date getDate() {  
  30.         return date;  
  31.     }  
  32.     public void setDate(Date date) {  
  33.         this.date = date;  
  34.     }  
  35.     public String getName() {  
  36.         return name;  
  37.     }  
  38.     public void setName(String name) {  
  39.         this.name = name;  
  40.     }  
  41.     public List<BeanModel> getList() {  
  42.         return list;  
  43.     }  
  44.     public void setList(List<BeanModel> list) {  
  45.         this.list = list;  
  46.     }  
  47. }  

 

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

未经允许不得用于商业目的
目录
相关文章
|
13天前
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
175 93
|
4天前
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
28 4
|
5月前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
116 5
|
1月前
|
Java 数据库
【YashanDB知识库】kettle同步大表提示java内存溢出
在数据导入导出场景中,使用Kettle进行大表数据同步时出现“ERROR:could not create the java virtual machine!”问题,原因为Java内存溢出。解决方法包括:1) 编辑Spoon.bat增大JVM堆内存至2GB;2) 优化Kettle转换流程,如调整批量大小、精简步骤;3) 合理设置并行线程数(PARALLELISM参数)。此问题影响所有版本,需根据实际需求调整相关参数以避免内存不足。
|
1月前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
110 17
|
2月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
133 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
2月前
|
安全 Java 开发者
Java并发迷宫:同步的魔法与死锁的诅咒
在Java并发编程中,合理使用同步机制可以确保线程安全,避免数据不一致的问题。然而,必须警惕死锁的出现,采取适当的预防措施。通过理解同步的原理和死锁的成因,并应用有效的设计和编码实践,可以构建出高效、健壮的多线程应用程序。
53 21
|
2月前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
143 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
2月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
260 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
2月前
|
Java Shell 数据库
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java 内存溢出 【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine! 【问题原因分析】java 内存溢出 【解决/规避方法】 ①增加 JVM 的堆内存大小。编辑 Spoon.bat,增加堆大小到 2GB,如: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms512m" "-Xmx512m" "-XX:MaxPermSize=256m" "-

热门文章

最新文章

下一篇
oss创建bucket