标准架构~业务层到底是否应该关注数据持久化的方式

简介:

业务层,你不能知道数据库的实现细节

这个话题也是网上谈论的非常多的,你的业务层是否会包含你的数据层的相关架构技术,如,你的数据层的持久化通过EF来实现,那么你的业务层是否也应该引入EntityFrameworks程序集?占占还是会告诉你,不应该,因为这样会使你的业务不再是纯粹的业务,它会依赖由你的数据层的持久化实现的技术,这是不对的,我们需要把业务层解藕出来,只有这样,你的数据层在进行技术切换时,业务层才不会受到影响,当然,这是理所当然的,如果你的数据库换技术了,还会影响到你的业务层,那么,你这个架构本身就是失败的!

我的EF架构失败了

在我的EF架构里,业务层使用了数据层实现的entityframeworks程序集,它知道了太多持久化的方式,所以,它是失败的,你失败,因为你让我无法简单的从一种ORM切换到别一种ORM。

失败的原因,可以理解

之所以在业务层引用entityframeworks,原因是“事务”,为了保证数据一致性,我们会在程序中加入事务块,而有时,sql2005来说,它会将本地事务不可理解的提高为分布式事务,这对于系统来说,无疑是一种负担,所以,我只能把这个事务块进行重写,重写后使它不会触发分布式事务,但同样也出现了一个惨痛的代价,那就是,一个本地事务需要具体同一个“数据上下文”,即entityframeworks里的DbContext对象,所以,BLL层就这样,依赖了EF,失败是可以理解的。

理想的事务应该放在数据层(基础设施层,持久化层)

事务总是和数据库相关,似乎与业务没什么关系,而业务层也不应该知道你的数据采用什么样的方式进行一致性的处理,一可以用SqlTransaction,也可以用TransactionScope,或者用第三方的事务组件,但归根到底,它们都是与持久化方式(ado.net的SqlTransaction,ef,linq2sql的TransactionScope)有关的,所以,放在业务层是绝对杜绝的,以下是从《Microsoft .NET企业级应用架构设计》一书中选自的一段话

数据访问层的4种主要职责:持久化、查询、管理事务、维护并发

SQL2008是美丽的

当SQLSERVER升级到2008,它似乎查觉到了什么,可能是一种坏味道,一种代码的坏味道,在SQL2005里,一个语句被发到SQL端,会reset一个SQL链接,正是一个reset导致我们的net把这个过程当成是一个分布式事务来处理,而SQL2008里,如果你的数据库是一个,那个它就会认为,你的这个过程是一个Local session的过程,即,本地会话,本地事务!

我的贡献

下面贡献一下我的SQL2005同一上下文不触发MSDTC的解决方案代码

    /// Author:zhang.zhanling
    /// 同步文章:http://www.cnblogs.com/lori/p/3455393.html
    /// 对TransactionScope,让它对同一个数据库不产生msdtc服务
    /// 环境:sql2005,sql2008本身已经解决了这个问题
    /// </summary>
    public class TransactionScopeNoMsdtc
    {
        /// <summary>
        /// 产生包裹事务
        /// 维持一个connection连接对象
        /// </summary>
        /// <param name="db">数据上下文</param>
        /// <param name="isOutest">是否为最外层,默认为false</param>
        /// <param name="action">处理代码块</param>
        public static void UsingNoMsdtc(IUnitOfWork db, bool isOutest, Action action)
        {
            var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;
            try
            {

                if (objectContext.Connection.State == System.Data.ConnectionState.Closed)
                    objectContext.Connection.Open();

                using (TransactionScope trans = new TransactionScope())
                {
                    action();
                    trans.Complete();
                }
            }
            finally
            {
                if (isOutest)//如果是最外层事务,再将连接关闭!内部事务与外部事务需要共用一个Connection的连接
                    objectContext.Connection.Close(); //只能关闭,不能dispose,因为dispose之后,上下文就无法得到链接串了
            }
        }
        /// <summary>
        /// 产生包裹事务,它不是最外层的,如果是最外层的需要调用其它重载
        /// </summary>
        /// <param name="db"></param>
        /// <param name="action"></param>
        public static void UsingNoMsdtc(IUnitOfWork db, Action action)
        {
            UsingNoMsdtc(db, false, action);
        }

    }

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:标准架构~业务层到底是否应该关注数据持久化的方式,如需转载请自行联系原博主。

目录
相关文章
|
28天前
|
机器学习/深度学习 数据采集 人工智能
揭秘!47页文档拆解苹果智能,从架构、数据到训练和优化
【8月更文挑战第23天】苹果公司发布了一份47页的研究文档,深入解析了其在智能基础语言模型领域的探索与突破。文档揭示了苹果在此领域的雄厚实力,并分享了其独特的混合架构设计,该设计融合了Transformer与RNN的优势,显著提高了模型处理序列数据的效能与表现力。然而,这种架构也带来了诸如权重平衡与资源消耗等挑战。苹果利用海量、多样的高质量数据集训练模型,但确保数据质量及处理噪声仍需克服。此外,苹果采取了自监督与无监督学习相结合的高效训练策略,以增强模型的泛化与稳健性,但仍需解决预训练任务选择及超参数调优等问题。
128 66
|
7天前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
17 5
|
23天前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
28天前
|
存储 监控 安全
大数据架构设计原则:构建高效、可扩展与安全的数据生态系统
【8月更文挑战第23天】大数据架构设计是一个复杂而系统的工程,需要综合考虑业务需求、技术选型、安全合规等多个方面。遵循上述设计原则,可以帮助企业构建出既高效又安全的大数据生态系统,为业务创新和决策支持提供强有力的支撑。随着技术的不断发展和业务需求的不断变化,持续优化和调整大数据架构也将成为一项持续的工作。
|
1月前
|
机器学习/深度学习 自然语言处理 数据处理
|
1月前
|
缓存 程序员 调度
第3章-图形处理单元-3.1-数据并行架构
第3章-图形处理单元-3.1-数据并行架构
27 1
|
19天前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
36 0
|
29天前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
31 0
|
1月前
|
存储 安全 关系型数据库
"揭秘!如何设计数据库架构,让信息系统心脏强健无比?一场关于数据效率、安全与可扩展性的深度探索"
【8月更文挑战第19天】数据库架构是信息系统的核心,关乎数据存储效率与安全及应用性能和扩展性。优秀设计需综合考量业务需求、数据模型选择、查询优化、事务处理、安全性和扩展性。首先,深刻理解业务需求,如电商系统需高效处理并增长商品、订单等数据。其次,基于需求选择合适的数据模型,如关系型或非关系型数据库。再者,优化查询性能与索引策略以平衡读写负载。同时,考虑事务处理和并发控制以保证数据一致性和完整性。最后,加强安全性措施和备份恢复策略以防数据风险。通过这些步骤,可以构建稳健高效的数据库架构,支持系统的稳定运行。
23 0
|
1月前
|
消息中间件 缓存 Kafka
图解Kafka:架构设计、消息可靠、数据持久、高性能背后的底层原理
【8月更文挑战第15天】在构建高吞吐量和高可靠性的消息系统时,Apache Kafka 成为了众多开发者和企业的首选。其独特的架构设计、消息可靠传输机制、数据持久化策略以及高性能实现方式,使得 Kafka 能够在分布式系统中大放异彩。本文将通过图解的方式,深入解析 Kafka 的这些核心特性,帮助读者更好地理解和应用这一强大的消息中间件。
87 0

热门文章

最新文章