一、情景使用

如果遇到有一批数据要入库,每一条数据入库前都要和数据库现有的数据做比对,以防止数据的重复入库时使用本模式。

二、模式定义和原理

将数据库中某张表或某批数据完整的加载到内存中,方便程序快速访问该资源,并在资源更新后,保证数据库中的数据和内存中的数据一致性。我们称之为“克隆模式”。

之所以我称之为克隆模式,是我认为此模式在解决程序快速比对数据库中数据时非常有用,它就像如今基因工程流行的克隆技术一样,将数据库中的某些数据完整的“克隆”到内存中,这样程序就可以只和内存打交道而无需和数据库打交道了。它将程序中需要与数据库中某些数据反复多次比较的数据一次性加载至内存,就能够减少与数据库的交互频率,且需要比对的数据在内存中,因此可以大大提高查找匹配的性能。

而正确使用这一模式的技术难点就在于如果保证数据库和内存中数据的一致性,避免灾难的发生。

二、模式使用情景

1、对比数据库中数据不变

当程序中需要与数据库中某些数据做比较时,而比对的数据是固定。那么就可以在程序启动时一次性加载到内存中,在程序运行期间一直驻留在内存中,不再需要从数据库中反复加载。

2、对比数据库中数据可变

在单线程中,程序启动时从数据库克隆欲比对的数据到内存,如果欲入库的比对数据中是不可重复的,那么就可以直接和克隆的数据比对,最后使用批量插入的方法,和数据库交互一次,更新数据库中的数据。然后从数据库中重新克隆一份数据覆盖内存中原来的那份。当然还有一种好方法就是,新数据入库成功后,立即将内存中的那份比对数据也更新,保证和数据库的一致性,从而不必再次与数据库交互克隆一份了。

在多线程中,问题就会变得麻烦许多。首先还是的保证内存中只有一份克隆的比对数据,只是现在对克隆数据资源的访问和更新操作,都必须要加锁的,否则就是灾难。在程序中只有一处访问和更新克隆资源时,正确的做法就是当一个线程要求和克隆资源访问时,就开始在这段代码加锁直到新数据成功更新至数据库中或确定线程无数据更新为止,且程序重新从数据克隆一份新的至内存,覆盖原来的版本或着跟好的方式是,直接将入库的数据更新至内存,保持与数据库中的一致性,这样可以减少与数据库的交互。

3.入库数据之中具有重复性。

如果要比对入库的数据都是不同的,那么就可以向2中说的那样完成工作,但如果的相同的,我们必须将每一条将要入库的数据载入到开始从数据库中加载的数据集合中,让后面每一个数据和这个集合做比对,这样就能保证即便新数据中有重复性,也能保证入库后不会出现重复的数据。然后一次性保存新入库的数据,如果更新数据失败,那么就要重新去掉克隆数据中将要入库的数据,或者重新从数据库克隆数据。

3.使用静态数据集实现共享

类的静态属性具有当类被加载后,以后对其静态属性的更改将会一直保留下来,任何它的实例对其静态属性的访问都是共享的,如将该类的数据集标记为静态的,就能始终保持该类所有的实例对象都共享同一个数据集属性。甚至您不需要实例该类,直接用类名来调用该静态属性。

下面是一个多线程下共享数据C#实现, 示例如下:

1、持久化数据的实体

public class Site

{

private string _name;

public string Name

{

get { return _name; }

set { _name = value; }

}

}

2、类的静态数据集属性

public class SiteStorage

{

public static List<Site> ListSite { get; set; }

}

3、程序启动时,从数据库中克隆一份数据方法

private List<Site> LoadAll()

{

try

{

//从数据库中克隆一份比对数据的代码段

}

catch (Exception)

{

throw;

}

return null;

}

3、数据访问类

public class SiteDao

{

public void DealWhithSite(Site site)

{

//从比对数据开始锁定,直到更新后结束

lock (typeof (SiteStorage))

{

//如果数据库中有这条记录了

if (FindSite(site) != null)

{

return;

}

//如果不存在这条记录,那么就更新到数据库中

else

{

Save(site);

SiteStorage.ListSite.Add(site); //将入库的记录更新至克隆数据中

}

}

}

private Site FindSite(Site site)

{

foreach (var s in SiteStorage.ListSite)

{

if (site.Name == s.Name)

return s;

}

return null;

}

private void Save(Site site)

{

try

{

//更新数据库的代码段

}

catch (Exception)

{

throw;

}

}

}

转载于:https://www.cnblogs.com/liuche/archive/2012/02/23/2365914.html

克隆模式----快速与数据库比对数据相关推荐

  1. mysql 复制数据_MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库.使用以下方法,可以非常简单地实现. 假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb.步骤如 ...

  2. 快速删除数据库中所有表中的数据

    今天又学到一招,可以快速删除数据库中所有的用户表中的数据.我是个菜鸟,望各位大神多多指教 select 'truncate table ' + Name + ';' from sysobjects w ...

  3. 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等

    Bringing impactful analysis into a data always comes with challenges. In many cases, we rely on auto ...

  4. 数据库的三级模式、二级映像及数据的独立性

    从数据库管理系统角度看,数据库系统通常采用三级模式结构,是数据库系统内部的系统结构 数据库系统模式的概念: 型(Type):对某一类数据的结构和属性的说明. 值(Value):是型的一个具体赋值. 模 ...

  5. 租户隔离怎么做MYSQL_基于JPA实现SaaS多租户模式的数据存储——共享数据库,隔离数据架构...

    SaaS是Software-as-a-Service(软件即服务)的简称,这边具体的解释不介绍.多租户的系统可以应用这种模式的思想,将思想融入到系统的设计之中. 现在SaaS Multi-Tenant ...

  6. 解决微信小程序云开发模式无法获取数据库数据问题

    解决微信小程序云开发模式无法获取数据库数据问题 问题: 在数据库有两条数据,获取数据时输出窗口没有任何反应 错误原因: 检查数据库名字是否对应 检查你是否有多个云开发环境 如果有多个云开发环境,就需要 ...

  7. MySQL快速比较数据库表数据

    1. 前言 有时需要比较MySQL不同数据库间结构相同的表数据是否相同,例如在测试环境与生产环境之间比较,或多个测试环境之间比较,以下提供一种通用的快速比较方式. 2. 比较方法 对于需要比较数据的数 ...

  8. 如何批量删除mysql的数据库_如何快速批量删除Mysql数据库中的数据表

    一个mysql数据库中,是可以同时安装几个网站程序的,在使用中,我们只需要用不同的数据库表前缀来区分就可以了.但随着我们不断调试,那么数据 库中的表,就会一天天的多起来,如一个一个的删除就很麻烦.很辛 ...

  9. python导入csv数据例子-使用python读取csv文件快速插入数据库的实例

    如下所示: # -*- coding:utf-8 -*- # auth:ckf # date:20170703 import pandas as pd import cStringIO import ...

  10. SQL达梦数据库复制表数据和表结构[当前模式下]

    达梦数据库复制表数据和表结构sql: 语法:create table 新表表名 as select * from 老表表名 示例: create table "SZFMIMP".& ...

最新文章

  1. 使用MATLAB实现的小算法练习1
  2. sublime_REPL使用及安装教程(解决Sublime无交互问题)
  3. Android layout 优化:使用include和merge 标签
  4. pythone 打开文件 一行_【精品资料】用了这么多年单片机的Hex文件不懂?看这篇就够了...
  5. SpringBoot中使用thymeleaf时点击按钮触发事件失败
  6. wxWidgets:wxContextMenuEvent类用法
  7. Python学习十大良好习惯
  8. 区别Transform、Transition、Animation
  9. Android的手势识别
  10. Git部署远程仓库至github
  11. aix oracle集群日志,在AIX环境下实施Oracle 集群RAC的结构 文平
  12. Netscreen ×××配置(一)---基于策略的点到点×××设置
  13. Metasploit中meterpreter里cmd乱码解决办法
  14. java html模板转图片、动态绑定数据
  15. 华为服务器的系统,华为服务器系统
  16. 金融跨计算机考研,计算机跨金融——我的二战考研复习计划给你们
  17. ie浏览器调用本地文件无反应_win7 ie浏览器打不开本地htm文件
  18. 【名说】DB2查询sql缓慢的调优方法
  19. HTML5 视频直播(一)
  20. 逆向学习1:52pojie第二课

热门文章

  1. NWT失败反省:说别人脑子进水了,汝脑子有没有进水?
  2. 管理感悟:产品功能比别人差,所以不能用?
  3. 建议让游客参与修长城
  4. 公司所有账号和密码,都要记录成文档
  5. android.os.DeadObjectException的解决办法
  6. Trie字典树数组实现
  7. 软件测试c语言笔试题目,软件测试笔试题库及答案.docx
  8. QT拖动界面的鼠标事件
  9. matlab中 晶闸管整流桥导通角_逆变角如何设置,matlab仿真模型作业
  10. python运算符_零基础学习 Python 之运算符