再此提供一种备份还原,方式,谨拿出来和大家探讨,寻求更好解决办法
需求:某人事管理系统,需要定期对某一个员工的联系人资料-->联系人资料(跨必须热播资料表)及联系人对应的电话(人员电话表),进行备份操作。
难点:1.由于用户较多,且每个用户的联系人资料大多在1000人左右,而且可能会备份多次,将会造成大量的冗余数据。
2.正常情况下所有用户的联系人在数在100万左右,电话则大约200万,如果直接进行备份的话,数据异常庞大,恢复操作
将异常缓慢,且~管理不方便。
3.存在联系人-》联系人电话的 1对多 对应关系。
解决方案:1.采用xml方式表示 人员-》电话一对多对应关系
2.将所有需要备份的数据转换为xml (采用XStream转换,之前项目一直使用,技术比较成熟)
3.将转换后的xml进行压缩 (采用jdk uitl工具包中GZIPOutputStream 压缩)
4.将压缩后的数据存储为CLOB格式(Oracle 11g数据库)
实施:
由于是现实中正在开发的项目,所以只提供部分修改后的代码,但也足够大家摸索使用了,请大家理解,再此主要提供该问题的思路,技术不是难点。
1.xStream 采用Anotation注解方式转换xml
@XStreamAlias("TEMPCLASS")
public class TEMPCLASS //类名的注解方式
@XStreamAlias("T_TEST_PROPERTY")
private String T_TEST_PROPERTY;//普通属性注解方式
@XStreamImplicit(itemFieldName = "tellist")
private List<tel> tellist;//1对多部分注解方式
//电话部分的同普通属性注解方式
2.压缩率问题:800+个联系人,转换为xml后,字符数为93万+,压缩后为9.1万左右,压缩率10倍+
//部分代码
GZIPOutputStream gzip = new GZIPOutputStream(xxxxx);
gzip.write(str.getBytes("UTF-8"));
3.存储方式,CLOB类型在存储时和普通String Number 类型,不同,具体可Google.