標籤:blog http ar io os 使用 sp for java
分類: 【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
- /*
- * $filename: TestMain.java,v $
- * $Date: 2013-11-28 $
- * Copyright (C) ZhengHaibo, Inc. All rights reserved.
- * This software is Made by Zhenghaibo.
- */
- package edu.njupt.zhb;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import net.sf.json.JSONObject;
-
- /*
- *@author: ZhengHaibo
- *web: http://blog.csdn.net/nuptboyzhb
- *mail: [email protected]
- *2013-11-28 Nanjing,njupt,China
- */
- public class TestMain {
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- BeanModel saveBeanModel = getInitBean();
- String clazzType = saveBeanModel.getClass().getName();
- String jsonString = JSONObject.fromObject(saveBeanModel).toString();
- printObject(saveBeanModel);//先列印一下看看
- ////////////////我們可以通過clazzType和jsonString,在程式中重建saveBeanModel對象
- JSONObject jsonObject = JSONObject.fromObject(jsonString);
- try {
- Object object = JSONObject.toBean(jsonObject, Class.forName(clazzType));
- /////////////////////此時的object就是我們由clazzType和jsonString兩個屬性恢複出的對象
- printObject(object);
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static BeanModel getInitBean(){
- List<BeanModel> list = new ArrayList<BeanModel>();
- for(int i = 0;i<10;i++){
- BeanModel beanModel = new BeanModel();
- beanModel.setDate(new java.util.Date());
- beanModel.setId(i);
- beanModel.setName("name"+i);
- }
- BeanModel saveBeanModel = new BeanModel();
- saveBeanModel.setId(11);
- saveBeanModel.setDate(new java.util.Date());
- saveBeanModel.setName("saveBean");
- saveBeanModel.setList(list);
- return saveBeanModel;
- }
- public static void printObject(Object object){
- String result = JSONObject.fromObject(object).toString();
- System.out.println("結果:"+result);
- }
-
- }
BeanModel.java
[java] view plaincopy
- /*
- * $filename: BeanModel.java,v $
- * $Date: 2013-11-28 $
- * Copyright (C) ZhengHaibo, Inc. All rights reserved.
- * This software is Made by Zhenghaibo.
- */
- package edu.njupt.zhb;
-
- import java.util.Date;
- import java.util.List;
-
- /*
- *@author: ZhengHaibo
- *web: http://blog.csdn.net/nuptboyzhb
- *mail: [email protected]
- *2013-11-28 Nanjing,njupt,China
- */
- public class BeanModel {
- private Integer id;
- private Date date;
- private String name;
- private List<BeanModel> list;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public Date getDate() {
- return date;
- }
- public void setDate(Date date) {
- this.date = date;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public List<BeanModel> getList() {
- return list;
- }
- public void setList(List<BeanModel> list) {
- this.list = list;
- }
- }
注意:對於我們“恢複”的對象,我們可以使用Hibernate的getCurrentSession進行儲存操作。但是,如果使用getCurrentSession來更新或刪除這個對象,那麼Hibernate就會報錯。此時,我們需要使用Hibernate的sessionFactory.openSession方法,獲得Session,然後再執行更新或者刪除操作。
未經允許不得用於商業目的
資料庫同步和使用JSONObject讓Java Bean“原地滿狀態複活”