【问题标题】:Switching Sql Session State databases切换 Sql 会话状态数据库
【发布时间】:2013-11-15 13:12:08
【问题描述】:

我有一个连接到多个数据库的 Web 应用程序实例。根据域名(例如www.shop1.com、www.shop2.com、..)我在Entity Framework中切换连接字符串。

shop1.com -> Database1

shop2.com -> Database2

shop3.com -> Database3

到目前为止一切顺利。

我也在使用 Sql Server 会话状态,我想切换会话状态数据库,就像我为我的数据切换数据库一样。

shop1.com -> SessionStateDatabase1

shop2.com -> SessionStateDatabase2

shop3.com -> SessionStateDatabase3

提前感谢您的帮助。


如果您想知道我为什么这样做,请提供更多信息:

实际上我正在实施多租户。上面的描述显示了三个站点。事实上,我有 50 多个。在接下来的几个月里,网站的数量将会增加。目前,所有站点都是单独部署的,这意味着每当我必须推出补丁或更新时,我都会部署所有 50 个站点。以这种方式维护网站正在成为一场噩梦。所以我考虑在一个实例上放置 5 到 10 个站点,具体取决于它们的使用情况,这样我需要维护的实例就更少了。

【问题讨论】:

    标签: c# session session-state multi-tenant sql-session-state


    【解决方案1】:

    在这种情况下,我总是查看框架的源代码。首先我找出配置存储会话状态连接字符串的位置,然后我找到它被使用的位置。私有类System.Web.SessionState.SqlSessionState.SqlSessionStateStore 有一个方法OneTimeInit(),它在其中读取连接字符串。在这里,我注意到有对partiniong 的支持,请参见此处:http://msdn.microsoft.com/en-us/library/aa478952.aspx。我以前从未听说过这个,但它看起来就像你想要的那样,你可以根据你想要的任何标准将会话状态存储在多个数据库中。顺便说一下问题+1,这是一个很酷的功能。此外,如果不成功,您可以尝试实现自己的 SessionStateStoreProviderBase 实现,该实现是可公开覆盖的。

    【讨论】:

    • 谢谢@fejesjoco。我肯定会在下周研究它,因为它看起来很有希望。
    • 我怀疑有没有其他好的方法可以做到这一点,这是一种受支持的好方法。实现 IPartitionResolver 并不是最简单的任务,因为您需要将会话 ID 映射到连接字符串。因此,如果您想根据域名进行决定,那么您需要以某种方式将域名映射到会话 ID。要么将该映射存储在某处(在 Global Session_Start 事件中),要么......我能想到的最简单的技巧是使用自定义 ISessionIDManager 并将数据库标识符直接放入会话 ID。因此,当您查看会话 ID 时,您就知道它在哪个数据库中。
    【解决方案2】:

    由于会话状态连接不是由您的代码管理的,因此您无法切换它。它是应用程序级别的配置和超出代码控制的范围。但不应该出现这种需要。单个服务器将能够管理您拥有的所有三个域的会话状态。唯一的问题可能是当用户从 shop1.com 移动到 shop2.com 并且仍然保留旧会话时。

    【讨论】:

    • 用户可以从 shop1.com 移动到 shop2.com 的原因引起了人们的关注。此外,如果用户仅在 shop1 上登录时设法在 shop2 上做某事,我也非常担心数据的安全性。
    • 我确信必须有解决方法或不同的方式来处理这种情况。
    • 如果会话 ID 存储在 cookie 中,浏览器将不会为不同的域发送它。所以那里没有问题。
    【解决方案3】:

    您是否有某些原因不考虑将(我假设是相同的代码)作为三个独立的 Web 应用程序运行?

    • 一个错误不会关闭所有三个站点
    • 会话状态由应用程序分隔
    • 允许扩展能力站点可以根据增长要求分配到不同的系统

    【讨论】:

    • 好问题。实际上我正在实施多租户。实际上我没有三个站点。我有 50 多个。在接下来的几个月里,网站的数量将会增加。目前,所有站点都是单独部署的,这意味着每当我必须推出补丁或更新时,我都会部署所有 50 个站点。以这种方式维护网站正在成为一场噩梦。所以我考虑在一个实例上放置 5 到 10 个站点,具体取决于它们的使用情况,这样我需要维护的实例就更少了。
    • 多租户模型更多地与数据库有关,而与网站的托管容器关系不大,如果您认为 50 岁时的问题很难解决,您可能正在查看一个网络农场更有理由转移到一个数据库中的多个站点。
    猜你喜欢
    • 2016-05-22
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多