`
BirdGu
  • 浏览: 25553 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

ASP模式应用中多客户数据管理方案探讨

阅读更多
ASP(Application Service Provider)模式应用与普通应用之间的一个重要差别是ASP系统需要管理多个客户的数据。不同客户之间的数据完全独立,没有关联。不允许一个客户查询另一个客户的数据。即使多个客户共享一个数据库,对单个客户来说,其它客户的数据可以看作是不存在的。 这里主要讨论在J2EE应用中如何解决这个问题。当然,这里讨论的方法对于其它架构的系统可能也适用。

方案1:单数据源,单套表。
所有客户的数据都存放在一个数据库的同一套表中, 在部分表中增加标示字段,表明该记录是属于哪个客户的。具体哪些表中要增加标示字段当然要看具体应用,不过我觉得可能大部分表示实体对象的表中都需要加。在很多查询条件中都需要包括这个标示字段。即使是用户自定义的查询,系统也需要在查询条件中加入该字段。

优点:数据源和数据库的管理都比较简单。数据源管理方面和普通的J2EE应用没有差别。

缺点:增加程序的复杂性。如果应用比较复杂,很多数据表都需要加入客户表示字段,很多查询都需要包括该字段,会比较麻烦。如果有遗漏,特别是查询条件中遗漏该字段,就会造成一个客户看到另一个客户的数据。另外,需要在系统的安全性方面做比较细致的设计。比如,某个功能通过在URL中包含某个实体的关键字以查询该实体的信息,或对该实体进行操作。在普通应用中后台只需要根据关键字查出该实体即可。但是在ASP应用中,就必须额外判定该实体是否属于当前登录用户,或者要在查询中条件中加入客户标示。当然如果有办法自动完成这样的检查或者自动修改发到数据库的查询条件,这个缺点就可以避免。只是我现在还没有想到这样做的好方法。

-------------------------------------
方案2:多套表,多数据源

数据库中每个客户一套表。可以是MySql, PostgresSQL, SQLServer中的不同数据库,或者Oracle中的不同schema。在应用服务器中配制不同的数据源,或者使用不同的连接池。 在访问数据库,需要得到数据库连接时,根据当前用户所属的客户选择合适的数据源或者连接池。

优点:不同客户的数据物理分离,安全性比较好。除了获取数据库连接部分的程序以外,其它程序和普通应用没有两样。不同客户的数据可以放置在不同的数据库服务器中,分担数据库服务器的负荷。

缺点:数据库连接的利用效率不高。ASP模式的主要客户是中小企业。这样带来的结果是客户数可能会很多,但是单个客户的用户数和并发登录数都不会太多。在系统这边来说,则是数据源或连接池很多,但每一个的利用效率都不高。在数据库服务器这边仍然会有很多连接,因为每个数据源或连接池都需要保持一定数量的可用连接。这样通过连接池共享数据库连接而减少总连接数的好处被大大削弱了。

另一个缺点是如果需要增加客户时,需要在应用服务器中配制新的数据源,或者修改应用自己的数据库连接池配制。某些情况下可能无法作到在应用不中断的情况下使这些配制生效。

------------------------------------
方案3:多套表,多Schema,单数据源。

这个方案基本是方案2的变种。很多数据库提供Schema,比如PostgresSQL中,同一个数据库下可以有多个Schema,Oracle中,每个用户就是一个Schema。即使用同一个用户登录数据库,只要在表名前加上schema名字,就能访问不同schema中的表。不同客户的数据就可以存放在不同的schema中。这样就能用同一个数据源或连接池,只是在所有的表名前要根据当前用户加上合适的shcema名字。如果要程序员自己这么做当然是很麻烦的。但如果用Hibernate就方便了。因为Hibernate中可以配制default schema,Hibernate在生成SQL时会自动在表名前加上schema名字。

因此如果使用Hibernate实现该方案就需要多个SessionFactory,每个客户对应一个SessionFactory。除了default schema以外,这些SessionFactory的配置完全一样。当程序需要SessionFactory的时候,需要有一个分配程序根据当前用户选择合适的SessionFactory。这些SessionFactory可以在系统启动时根据配制文件全部建立好,也可以采取lazy initialize的方法,这样也能支持动态增加客户。

优点:除了方案2的优点以外,共享数据源或连接池,效率更高。

缺点:对实现手段有一定依赖性。使用Hibernate会比较容易实现,其它方式我不清楚。每个SessionFactory都会有一定开销。多个SessionFactory会增加这部分开销,增加到多少程度,对性能有多少影响还有待测试。多个SessionFactory的情况下,二级缓存会否互相干扰,还是每个SessionFactory有各自自己的二级缓存也有待测试。

------------------------------------
所有以上方案都是所有客户共享同一个应用(WAR或EAR)。这种方式有一个缺点,不过这个缺点和数据源无关。如果用户可以以点菜式的方式选购不同功能,也就是说虽然不同客户共享一个应用,但是提供给他们的功能是不同的。这种情况下,程序中会有很多地方要判断用户是否可以使用某功能。这会带来另一种麻烦。这个和权限控制有类似,也许可以用Acegi之类的框架解决。但和权限控制又不完全一样。因为有时简单地提示用户他无权使用某功能可能不够友好,而需要以一种更优雅的方式提供用户降级过的系统功能。当然这个和具体应用有关,这里就不展开了。

------------------------------------
方案4:多套表,多应用

这个方案和以上方案不同,除了数据物理分离以外,应用也物理分离。每个客户有各自自己的WAR或EAR。如果使用方案3中的多Schema的方法,那么数据源可以共享,每个应用的SessionFactory有不同的default schema。

优点:应用简单。这样的应用和普通的J2EE应用没有任何区别。支持高度定制化的系统功能。每个应用基本相同,又可以有很大差别。比如用户没有选择的功能更本就不部署。

缺点:应用服务器中每个应用都会有一定的开销,占用一定的固定的内存。这个开销来自于应用服务器管理应用的数据结构;每个应用的class loader,和读入的类的字节码(应用服务器会判断出不同应用的同样名字的类具有同样的字节码,从而只保存一份吗?对次我表示高度怀疑);每个应用还可能会有自己的线程,比如任务调度线程。这些开销可能会使一个应用服务器能部署的应用不会太多(和ASP模式的潜在客户数比较),从而在客户数比较大的情况下需要增加应用服务器的数目。
分享到:
评论
4 楼 together 2006-10-23  
如果采用方案二,我觉得使用离散式数据库更为合适。
比如firebird。可以为每个应用,创建一个单独的gdb文件。这样在创建数据库连接、备份还原、数据库安全、客户定制方面,都非常方便。唯一不太爽的是,firebird的索引性能,不如oracle/sqlserver。在单表数据上百万时,分页速度(比oracle/sqlserver)会慢一些
3 楼 SteveGY 2006-10-22  
我正在使用Plan2,担心的就是这个多数据源。应用程序使用iBATIS,现在只能以DBCP配置实现,在小客户量的情况下,问题不是很大,但数据库连接数、连接池效率在30个客户以上时,会有性能问题。我使用PostgreSQL,最大25并发连接,单台Solaris 10 x86服务器。连接池再配置的小一些,仔细地调整每一个客户的实际情况,可在单台机器上实现可以接受的性能,超过一定性能要求时,增加服务器肯定是必须的。
2 楼 BirdGu 2006-10-22  
hexiaodong 写道
分析的挺细致的,暂。
我们现在用的是方案二,这个方案在开发和部署方面都没有问题,只要你别把针对不同企业的数据源配置文件部署到classes目录下,在新增企业用户的时候就不用中断应用了。
数据库连接占用问题,你只要把不活动线程的生存时间尽量设置小一点,那么问题也不大的。因此我推荐的是方案二。

至于方案三,你提到需要为每个客户配置SessionFactory,这样的话,岂不是增加客户时,需要中断应用了。不大好吧。

每个数据源或连接池中是否至少要有一个活动连接?否则每次用户申请时再建立连接速度就太慢了。这样对数据库来说活动连接的数目不会少于数据源或连接池的数目,也就是不会少于客户数。对性能有多大影响就看你有多少客户了。

SessionFactory可以动态生成的。因为所有的SessionFactory的配置基本是一样的,只是default schema不同。最简单的就用客户好作为schema name,那增加客户时就没有什么需要额外配置的了。
1 楼 hexiaodong 2006-10-21  
分析的挺细致的,暂。
我们现在用的是方案二,这个方案在开发和部署方面都没有问题,只要你别把针对不同企业的数据源配置文件部署到classes目录下,在新增企业用户的时候就不用中断应用了。
数据库连接占用问题,你只要把不活动线程的生存时间尽量设置小一点,那么问题也不大的。因此我推荐的是方案二。

至于方案三,你提到需要为每个客户配置SessionFactory,这样的话,岂不是增加客户时,需要中断应用了。不大好吧。

相关推荐

    asp客户管理系统

    在本文中,我们将深入探讨一个以ASP技术为基础的客户管理系统,该系统以其出色的功能和用户友好的界面而受到好评。 一、系统概述 ASP客户管理系统,通常被称为ztcrm,是一个基于ASP技术构建的企业级应用,主要用于...

    asp.net 客户关系管理系统完整源码.rar

    ASP.NET 客户关系管理系统(CRM)是一种基于Web的应用程序,用于管理企业的销售、市场和服务流程,以提高客户满意度和企业效率。此压缩包提供的是一套完整的源代码,供开发者学习、研究或作为基础来构建自己的CRM...

    asp.net 数据映射方案

    在这个方案中,我们将探讨如何在ASP.NET环境中实现数据映射,以提高开发效率和性能。 首先,ASP.NET提供了多种数据映射框架,如Entity Framework、NHibernate和Dapper等。这些框架简化了对数据库的操作,减少了对...

    asp.net 设计模式

    《ASP.NET设计模式》作为一本经典教材,深入探讨了在ASP.NET开发中应用设计模式的重要性与实践方法。设计模式是一种经过验证的解决方案,用于解决软件设计中的常见问题。在ASP.NET这一特定领域,设计模式的应用可以...

    MVC模式在ASP.NET中的应用

    本文将深入探讨MVC模式在ASP.NET中的具体应用和优势。 **一、MVC模式简介** 1. **模型(Model)**:模型是应用程序的核心部分,负责处理业务逻辑和数据管理。它与数据库或其他数据源交互,获取或更新数据,并通过...

    asp.net 应用实例

    ASP.NET 提供了多种状态管理机制,包括视图状态、隐藏字段、Cookie、Session 和应用程序状态等,以保持用户交互过程中的数据。 7. **MVC 模式** MVC 模式在 ASP.NET 中强调了模型、视图和控制器之间的解耦,使...

    asp.net工厂模式加三层写的酒店管理系统

    本文将深入探讨如何在ASP.NET中运用工厂模式来设计和实现一个酒店管理系统。 ### 一、ASP.NET基础 ASP.NET提供了一个丰富的开发环境,支持多种编程语言,如C#、VB.NET等。它通过.NET Framework提供服务,包括HTTP...

    ASP.NET 设计模式

    #### 三、ASP.NET应用程序架构与设计模式应用 - **第3章:分层应用与关注点分离**: - 介绍了多层架构的基本概念及其在ASP.NET中的应用。 - 描述了如何通过将应用分为不同的层来实现关注点分离(Separation of ...

    基于asp.net的企业客户管理系统设计与实现

    2. MVC架构:阐述MVC模式在客户管理系统中的应用,以及它如何帮助分离关注点,提高代码可维护性和测试性。 3. 数据库设计:讨论如何使用关系型数据库(如SQL Server)来存储客户信息,包括表结构设计、数据关系和...

    ASP.NET设计模式.pdf中文版

    根据《ASP.NET设计模式.pdf中文版》的介绍,该书由微软VIP经理编写,深入探讨了如何将经典的23种设计模式应用到ASP.NET开发中。以下是对这些设计模式及其在ASP.NET中的应用场景的简要介绍: 1. **工厂方法模式**:...

    中商互联客户管理系统ASP.NET

    【中商互联客户管理系统ASP.NET】是一款...中商互联客户管理系统通过ASP.NET的强大功能,为企业提供了一套全面的客户管理解决方案,从客户信息管理、销售跟踪到售后服务,覆盖了CRM的核心环节,提升了企业的运营效率。

    基于ASP模式的医院信息化系统的建设与应用研究.rar

    【标题】: ASP模式在医院信息化系统建设中的应用 【正文】: 医院信息化系统的建设和应用是现代医疗领域的重要组成部分,它极大地提升了医疗服务的质量和效率。本文主要探讨的是基于ASP(Application Service ...

    C#客户管理系统

    本文将深入探讨以C#编程语言构建的客户管理系统,介绍其设计思想、核心功能以及实现方法,旨在为读者提供一个全面了解C#客户管理系统的视角。 C#是一种面向对象的、类型安全的编程语言,由微软公司开发,广泛应用于...

    ASP.NET数据库应用程序开发教程

    本教程将深入探讨如何使用ASP.NET进行数据库应用程序的开发。 一、ASP.NET架构 ASP.NET基于.NET Framework,包括Web Forms、MVC(Model-View-Controller)、Web Pages和API等多种开发模式。其中,Web Forms提供事件...

    ASP.NET Web应用系统项目开发

    在本文中,我们将深入探讨ASP.NET Web应用系统的架构、开发流程、主要技术及其实现细节。 首先,ASP.NET是.NET Framework的一部分,它提供了一种用于构建动态网站、Web应用程序和Web服务的模型。其核心优势在于它...

    asp.net+sql学生宿舍管理系统

    ASP.NET 和 SQL Server 结合构建的学生宿舍管理系统,为这一需求提供了强大而可靠的解决方案。本文将深入探讨这个系统的相关知识点,包括 ASP.NET 的核心技术、SQL Server 数据库设计以及两者如何协同工作实现高效...

    7 asp.net应用与开发案例教程.rar

    本教程将深入探讨ASP.NET的应用与开发,通过一系列案例来帮助学习者掌握这项技术。 首先,ASP.NET的核心概念包括Web Forms、MVC(Model-View-Controller)和Web API。Web Forms是ASP.NET最初提供的编程模型,基于...

    asp.net网络应用开发例学与实践

    《ASP.NET网络应用开发例学与实践》是一本深度探讨ASP.NET技术的书籍,由郭常川和李云锦两位作者合著。本书的核心目的是通过实例教学的方式,帮助读者掌握ASP.NET在网络应用开发中的实际运用,提升开发技能。在源码...

    ASP人事档案管理系统(ASP.NET,JAVA,JSP,VB,ASP)

    下面将详细探讨这些技术在人事档案管理系统中的应用及其重要性。 首先,ASP.NET是微软开发的一种Web应用程序框架,它以C#或VB.NET作为主要编程语言。在人事档案管理系统中,ASP.NET提供了强大的数据绑定、控件和...

Global site tag (gtag.js) - Google Analytics