关于重新设计data accessing layer的思考(一)

背景:项目中已运行10年的数据访问层,存在若干架构方面的问题,为了彻底解决并释放并行访问的能力,并提供一套完整的面向对象的API,决定重新设计。

思考问题:

1.如何保证兼容性:  

  1)使用新库的实现替代旧库中的实现,保证一次性全部修改并测试,不修改旧库的API,且提供用户新的API

  2)新库与旧库完全隔离,同时存在,但新库需要保证与旧库的数据同步。旧库不做任何修改。用户可以同时使用新库和旧库

2.如何保证多线程访问的效率:

  1)一直以来,内存和CPU总会出现冲突,在数据访问更是如此。当动态数据在内存中只有一个存储地址,必然在多线程访问中需要各种同步机制,或者异步访问而影响到效率。如果牺牲内存,提供内存的duplication,那么存在的问题,变为了内存的使用量double,并且需要merge这些修改,或者是duplication。实际上,数据库的设计中,对这个问题提供了多种的解决方式,比如snapshot。实际上这种思路在旧的Data
Accessing
Layer的设计中,也体现了一些,当时一开始数据存在内存中只有一份,但运行时发现在多线程或者多进程的条件下,使用锁的机制,无法完全发挥多线程的优势。后来只能采取通过数据的多个备份,来保证多线程的效率。当然每个备份就需要相互之间的数据同步,这也就造成了一个问题,就是当出现conflict怎么办的问题。最初,我认为,将数据放在share
memory中大家一起共享,似乎是一个最方便且最有效率的方法,但越来越发现,如果想充分发挥多线程或者多进程的效率,应该考虑的是如何在内存使用量和CPU效率之间做一个权衡。

  2)减少数据的互斥性,特别是对于动态数据。修改数据库中Data
Model,保证表中的数据均为运行期产生的动态数据(对于现有数据中,80%均为静态数据),将静态数据存入sharememory,
给所有进程共享,并且使用单独进程preload. 对于动态数据,特别是字符串数据,能够使用enum进行映射就应该从数据库中移出。

  3)每个线程当访问时,会创建一个独有的数据的snapshot,这样,当线程需要提交修改时,将自己决定如何处理conflict.

(待续)

时间: 2024-08-09 02:28:03

关于重新设计data accessing layer的思考(一)的相关文章

Network 5: Data Link Layer

Some important issues related to Data Link Layer: Ethernet uses CSMA/CD with binary exponential backoff as multiple access control protocol, and stipulates the minimum frame length is 64 bytes. 以下代码纯属娱乐,如能运行,纯属巧合. 1 public void transmit() { 2 int col

专职DBA-MySQL DAL(Data Access Layer)中间件总结

MySQL DAL(Data Access Layer)中间件总结 DAL是数据访问层的英文缩写,即为数据访问层(Data Access Layer).用在这里可能不是特别恰当,因为本文主要介绍MySQL访问的中间件,不过也是属于DAL的范畴.本文不会去高可用相关的知识,主要聚焦于MySQL的横向扩展. 我们知道最简单的一种扩展是MySQL 主从复制,通过1主多从来实现读的性能扩展,但是这样的扩展不仅仅有局限性,而且写入的问题并没有解决.目前市场上用三类解决方案: 1.客户端分片(推荐) 程序客

Create the Data Access Layer

https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/create_the_data_access_layer This tutorial describes how to create, access, and review data from a database using ASP.NET Web Forms an

csharp: Procedure with DAO(Data Access Object) and DAL(Data Access Layer)

sql script code: CREATE TABLE DuCardType ( CardTypeId INT IDENTITY(1,1) PRIMARY KEY, CardTypeName NVARCHAR(100) NOT NULL, --卡类名称 CardTypeColor NVARCHAR(50) NOT NULL --卡颜色(或样本) ) GO IF EXISTS (SELECT * FROM sysobjects WHERE [name] = 'proc_Insert_DuCar

Hadoop ->> 关于数据分割(Data Split)的思考

今天开始学习Hadoop这门热门的数据库技术.直接从被奉为Hadoop圣经的<Hadoop The Definitive Guide 4th Edition>入手.第一章作者写到一个关于分布型数据库系统在处理数据分割时的两种方法:1)按照某个单位(诸如年份或者数值范围):2)均匀分割所有数据到若干份(分布式计算机的数量): 第一种方法可能的问题是分割后数据块的大小不一,像以年份为例,很可能出现最小份和最大份的数量级差异很大.这样最后那个最大的就会成为其他任务的等待.第二种方法的问题是实现起来要

Generic Data Access Layer泛型的数据访问层

http://www.codeproject.com/Articles/630277/Generic-Data-Access-Layer-GDA-Part-I http://www.codeproject.com/Articles/681565/Self-Synchronized-Data-Access-Layer?msg=5004433#xx5004433xx

Indexing Sensor Data

In particular embodiments, a method includes, from an indexer in a sensor network, accessing a set of sensor data that includes sensor data aggregated together from sensors in the sensor network, one or more time stamps for the sensor data, and metad

杂项-SAP:SAP (服务访问点(Service Accessing point))

ylbtech-杂项-SAP:SAP (服务访问点(Service Accessing point)) 1.返回顶部 1. SAP,是Service Accessing point的缩写,意思是服务访问点,即上层访问下层所提供服务的点. 中文名:服务访问点 外文名:Service Accessing point 简    称:SAP 解    释:上层访问下层所提供服务的点 SAP SAP(Service Access Point)是上层访问下层所提供服务的点.在计算机体系结构中,下层是为相邻上

layer弹框

function canshuadd(){     var html='<div class="panel panel-default toggle">';       //  html+='<label class="col-lg-2 control-label">*名称:</label>';         html+='<div class="col-lg-4" style="margin