中端帮助需要

一句话,我最终需要知道的是如何共享中层职能之间的物体瓦特/输出需要应用层来传递数据模型对象。

我工作在我们目前的环境下建立一个中间层层为我工作的公司。 目前我们使用的主要.NET编程,并围绕着我们所有的不同的数据库系统(从甲骨文,OpenLDAP的,MSSQL,和其他人)自定义数据模型。

我快到试图从应用层拉我们的模型并将其移到了一系列的中端库的问题。 我遇到的主要问题是,应用程序层必须挂在一个缓存的对象在整个过程的持续时间,并根据缓存的数据更新的能力,但中端的操作没有。

我试图保持模型对象出尽可能多的应用程序,这样,当我们更改了底层的数据库结构,我们就可以进行编辑,轻松地重新部署中间层和多个应用程序不需要重新构建。 我给的问题是伪代码什么的简要更新,因为这是我们的开发人员了解最好的:)

main { MidTierServices.UpdateCustomerName("testaccount", "John", "Smith"); // since the data takes up to 4 seconds to be replicated from // write server to read server, the function below is going to // grab old data that does not contain the first name and last // name update.... John Smith will be overwritten w/ previous // data MidTierServices.UpdateCustomerPassword("testaccount", "jfjfjkeijfej"); } MidTierServices { void UpdateCustomerName(string username, string first, string last) { Customer custObj = DataRepository.GetCustomer(username); /******************* validation checks and business logic go here... *******************/ custObj.FirstName = first; custObj.LastName = last; DataRepository.Update(custObj); } void UpdateCustomerPassword(string username, string password) { // does not contain first and last updates Customer custObj = DataRepository.GetCustomer(username); /******************* validation checks and business logic go here... *******************/ custObj.Password = password; // overwrites changes made by other functions since data is stale DataRepository.Update(custObj); } }

在一个侧面说明,我认为正在建立一个家庭长大的缓存层,这需要大量的时间,是一个非常困难的概念来销售管理选项。 使用具有内置的缓存支持,如NHibernate的一个不同的建模层:这也很难出售给管理层,因为这个选项也需要花费很长的时间撕开我们整个定制模式,它取代瓦特/第三方解决方案。 另外,也不是很多厂商的支持我们的大阵的数据库。 例如,.NET有LINQ到ActiveDirectory中,而不是LINQ到OpenLDAP的。

总之,遗憾的小说,但它是一个更多的是企业体系结构类型的问题,而不是一个简单的代码的问题,如“我如何获得当前的日期和时间。NET?

编辑

对不起,我忘了添加一些非常重要的信息在我原来的职位。 我感觉很不好,因为Cheeso经历了很多的麻烦,写得很深入响应这将有固定的我的问题是不是有更多的问题(我愣神不包括)。

我现在面临的问题,目前的主要的原因是在关系到数据复制。 第一功能使一个写一个服务器,然后下一个功能使从其中没有接收到复制数据又一服务器读取。 所以基本上,我的代码比数据复制过程更快。

我可以解决此通过始终读取和写入同一个LDAP服务器,但是我的管理员可能会杀了我的。 在专门设置了一个即只用于书写和服务器,然后其他4个服务器,负载平衡器之后,即仅用于阅读。 我丝毫不为LDAP管理员,所以我不知道如果这是标准程序。

--------------解决方案-------------

你要描述一个非常普遍的问题。

正常的方法来解决这一问题是通过使用开放式并发控制。

如果这听起来像官样文章,事实并非如此。 这是很简单的想法。 术语的并发性部分是指这样的事实,有更新发生到数据-纪录,并且这些更新是同时发生。 可能许多作家。 (你的情况是一个退化的情况,其中一个作家是问题的根源,但它是相同的基本想法)。 乐观的一部分,我会在一分钟。

问题

这是可能的,当有多个作者,两种更新读+写部分成为交错。 假设你有A和B,两人读取,然后更新数据库中相同的行。 A读取的数据库,则B读取数据库,则B更新它​​,那么A将更新它。 如果你有一个天真的做法,那么“最后写”会成功,B的写入操作可能会被破坏。

输入乐观并发。 其基本思路是假定该更新将工作,但检查。 有点像信任但要验证的方法来军控从几年前。 要做到这一点的方法是将包含在数据库表中,必须将其还包括在域对象,它提供了一个方法来区分一“版本”从另一个分贝行或域对象的一个​​领域。 最简单的是使用时间戳字段,命名lastUpdate,它保存最后一次更新的时间。 还有其他更复杂的方式做一致性检查,但时间戳字段是很好的说明目的。

然后,当作家或更新要更新数据库,它只能更新其中的关键比赛(无论您的键), 以及当出现lastupdate匹配的行。 这是验证部分。

由于开发人员理解的代码,我将提供一些伪-SQL。 假设你有一个博客的数据库,索引,标题,和一些文字为每个博客条目。 你可能会为获取一组行(或物体)这样的数据:

SELECT ix, Created, LastUpdated, Headline, Dept FROM blogposts
WHERE CONVERT(Char(10),Created,102) = @targdate

这样的查询可能会检索所有的博客文章在数据库中的某一天或一个月,或什么的。

通过简单的乐观并发,你会使用这样的SQL 更新一行

UPDATE blogposts Set Headline = @NewHeadline, LastUpdated = @NewLastUpdated
WHERE ix=@ix AND LastUpdated = @PriorLastUpdated

如果索引相匹配的更新仅发生(和我们推测这是主键),并且LASTUPDATED字段是相同的是什么东西时,数据被读出。 另请注意,您必须确保更新的领域LASTUPDATED每一个更新的行。

更严格的更新可能会坚持认为,没有任何列已经更新。 在这种情况下,有没有时间戳的。 事情是这样的:

UPDATE Table1 Set Col1 = @NewCol1Value,
Set Col2 = @NewCol2Value,
Set Col3 = @NewCol3Value
WHERE Col1 = @OldCol1Value AND
Col2 = @OldCol2Value AND
Col3 = @OldCol3Value

为什么叫“乐观”?

OCC用作替代保持数据库锁,这是一种笨拙的方法来保持数据一致。 一个DB锁可能会阻止任何人读取或更新数据库行,同时举行。 这显然​​有巨大的性能影响。 所以OCC放松的是,并作用“乐观”,通过假定,当涉及时间更新,在表中的数据将不会被在此期间进行更新。 当然,它不是盲目乐观 - 你必须检查更新之前。

使用在实践乐观Cancurrency

你说你使用.NET。 我不知道,如果你使用的数据集的数据访问,强类型或以其他方式。 但是.NET数据集,或特别DataAdapters,包括OCC内置支持。 您可以指定和手工代码更新命令任何DataAdapter的,那就是在那里你可以插入一致性检查。 这也是可能的范围内的Visual Studio设计经验。

如果你违反了,该更新将返回的结果显示,零行进行了更新。 您可以在DataAdapter.RowUpdated事件检查。 (请注意,在ADO.NET模型中,有一个不同的DataAdapter为每个排序的数据库,有对的SqlDataAdapter,它与SQL Server的作品的链接,但你需要一个不同的DA为不同的数据源。)

在RowUpdated事件,您可以检查已受影响的行数,然后采取一些行动,如果计数为零。


概要

验证数据库的内容没有改变,书写更新之前。 这就是所谓的乐观并发控制


相关链接:

  • MSDN上的乐观并发控制在ADO.NET
  • 教您如何使用SQL时间戳的OCC
分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • ColdFusion的SOA风格的建筑? 2013-03-23

    公司内部系统的后端越来越复杂,我想探讨这样做的,而不是一个沉重的单片系统SOA风格建筑的想法. 我从哪里开始? 我是新来的SOA. 这是否意味着......个别CF的情况下,他们通过远程Web服务调用彼此交谈? 如何将一个处理像...错误处理和服务器中断? 将一个ESB是架构有益的,如果它的每一个组成部分都在ColdFusion的? 如何DB层? 如果他们共享一个庞大的数据库还是应该存放东西在自己本身的方法吗? 谢谢 --------------解决方案------------- 首先,什么是你

  • 建筑耗材URI /网址为模型(滑轨/ DataMapper的/ SOA) 2012-11-29

    也许你可以帮我觉得这通过对更多细节. 我需要建立或提供一个URI的,可以被引用或由其他应用程序可能会或可能不会是一个Rails应用程序使用的模型实例. 例如 我创建了一个标准的发布与内容; 我想通过查看数据库中的模型(或其他少而黏的方式),以建立该职位其他应用程序可以使用和引用的URL. DataMapper的有一个URI领域,我想建立一个规范的URI,它存储在那里,并有其他应用程序能够访问,宣布,操纵等. 基本上,我有若干应用,可能是在不同的地方,需要访问相同的模型,做与模型不同的事情. 我需

  • SOA:图书馆VS服务:可图书馆是一个更好的选择吗? 2012-01-30

    我与WCF 4.0工作,对如何从技术角度构建服务是一个好主意. 我一直在与WCF现在工作了3年. 尽管我和别人谈论我有什么应该是软件,构成了一个服务单位,什么不应该不同的想法. 很多人谈论我认为服务应该是颗粒状. 转向他们的一些大会的进入服务的时候我的确以前的公司已经花费了很多(所以我一直告诉). 在许多情况下,我不能看到如何服务好......也许它并不总是应该. 我给你举个例子:在我们的系统,我们有真的已经成长为执行两个不同的独立作业的大型服务. 我将它分割成两个服务,原因有二:性能和故障隔离

  • 起床速度在现代建筑 2012-04-17

    我没有任何正式的学历计算机科学,而我自学了传统的ASP回到了互联网泡沫的日子,并设法让自己的作业,并从那里我的职业生涯发展. 我是一个自信,我觉得,还不错的程序员在ASP中3,但正如其他人观察到的问题,传统的ASP之一是,它没有隐藏的事实真相HTTP的一个很好的工作,所以你可能会变得相当称职的你与人合作的技术的理解比较差的基础上,一个程序员. 当我换到.NET起初我对待它像传统的ASP,开发独立的应用程序作为单独的网站,只是因为我不知道任何好转的时候. 我提出这一点的工作,并在接下来的几年工作的

  • 在SOA世界大容量 2012-07-21

    我是相当新的SOA世界,我已经读了很多关于它. 有但是有一件事是仍不清楚我这是处理大量数据. 到目前为止,我们公司使用的"饲料",以不同的应用程序之间的集成. 例如,AS400将吐出了大量的可能是由其他应用程序,处理它,并将它存储他们的内部数据库中拿起XML文件. 其缺点是,我们必须处理与走来所有可能的问题这个文件源(两端). 乘以这个多次,需要整合,不同的团队,缺乏整体的规则,这一点,你可以想像我们今天所处的不同的应用. 该公司决定采用SOA策略,所以我期待此事. 我不知道SOA的概

  • SOA / Web服务分页 2012-11-06

    在SOA中,我们不应该建立或保持状态(或设计相关性)客户端和服务器之间. 这是可理解的. 但是,什么模式可以遵循,客户端要消耗可能返回的"行"的开放式数字实时服务的情况下? Web应用程序,类似于SOA,但允许状态(会话)已经解决了这个与分页. 分页需要(在大多数情况下,尤其是与SQL)服务器保存数据,并且客户端请求块中的数据. 如果我们在这里要考虑分页般的场景Web服务,什么样的模式将这些遵循将仍然允许SOA的原则要坚持(或尽可能接近). 对于思想家的一些规则:1)背靠一个SQL数据

  • 在SharePoint列表中的邪恶基于SOA的企业? 2012-12-03

    我公司是从客户端/服务器应用程序移动(胖客户端应用程序,使数据库直接调用),以面向服务的架构(SOA)(薄或厚客户端调用Web服务,然后执行业务逻辑和调用数据库). 这部分包括使用SharePoint作为我们的客户(不是我们唯一的客户端类型,但其中最主要的). 我一直在看在SharePoint的Pluralsight的培训,我开始看到了很多关于SharePoint列表. SharePoint列表似乎到SharePoint的核心部分. 不过他们也似乎是一个巨大的退步建筑讲话. 这些都是我的顾虑:

  • SOA:加入跨多个业务数据 2012-12-12

    想象一下,我们有2个服务:产品和订单. 基于我的SOA的了解,我知道,每个服务都可以有其自己的数据存储(一个单独的数据库,或一组表在同一数据库中). 但是,没有服务被允许直接接触的另一种服务的数据存储. 现在,想象一下我们所储存独立的内部产品和订购服务的产品和订单数据. 在订购服务,我们可以通过自己的ID标识的产品. 我的问题是:在此架构下,我怎么能显示订单和产品细节的"相同"的页面就行了? 我的理解是,我应该得到来自OrderService的的OrderItems的列表. 每个订单项

  • 所以,也许这是我应该去一个SOA的情况? 2012-12-29

    场景:我有一个CRM系统,和我的应用程序. 当在CRM系统中创建一个新的秩序,对myApp应该做一些东西(创建顺序的项目室),和写的东西(项目室URL)返回到CRM系统. 所以,我可以很容易地实现这一点使用点对点集成,对myApp托管服务,当有东西完成后,调用了CRM的服务. 问题是:我应该去增加一些服务总线(额外的代码,额外maintaince)的额外的努力,或者是不是合适呢? 公司拥有当今没有服务总线,并没有整合策略可言. 在情况下,'是'对上述问题(我那种期待的)什么是多余的时间我应该包括

  • 什么是建筑形态和建筑风格之间的区别是什么? 2013-01-15

    在Software Architecture - Foundations, Theory and Practice ,我可以找到两个定义. 问题是,我不明白他们每个人是指用简单的英语是什么: 架构模式. 一种架构模式是建筑设计决定,适用于参数考虑到在这个问题出现不同的软件开发环境中反复出现的设计问题的命名集合. 建筑风格. 一个建筑风格的建筑设计决定:(1)适用于特定的发展背景下的指定集合,(2)限制建筑设计决策,特定于环境中的特定系统和(3)引起的每个有益的素质由此产生的系统. 因此,在简单的

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.127 (s). 10 q(s)