【问题标题】:Multiple Connections for a single user单个用户的多个连接
【发布时间】:2013-02-18 20:41:45
【问题描述】:

我正在尝试找出将以下逻辑放入我的 Delphi datasnap 服务器的最佳/“正确”位置。

用户连接到服务器,并使用提供的凭据,我使用集中的 AuthorizationDatabase(Oracle 数据库)对其进行验证。如果他们实际上是一个有效用户,那么我想根据授权存储库所说的(可能是另一个主机、数据库、用户名、密码)为他们提供与他们的数据实际所在位置的连接。

我在自己的服务器类中拥有 AuthorizationDatabase,这是服务器生命周期,因为没有经过验证就无法进入。这会产生并发问题吗? 10个用户同时登录验证,这样可以吗?

我有一个基础服务器模块,所有会话级数据模块都从该模块派生,它具有应用程序连接。应用程序连接参数可以根据用户登录而改变。

我遇到的问题是将授权/验证/新数据库参数分配过程放在哪里。

这种两步数据库方法最适合哪里?这似乎很常见,用户在一个地方得到验证,但他们最终要访问的数据在另一个地方。

在查看示例时,我看不出它有什么明显的地方。

【问题讨论】:

    标签: delphi datasnap


    【解决方案1】:

    在多个会话之间共享一个连接是不安全的,当 2 个会话尝试同时读取数据库时,您会收到“读取错误”或其他错误。

    但是你可以有一个集中的登录位置,只要让它线程安全,就可以了:

    TMonitor.Enter(LoginDM);
    Try
     valid := LoginDM.Login(username, password);
    finally
      TMonitor.Exit(LoginDM);
    end;
    

    关于用户访问数据,由于每个用户都有自己的会话,该会话在线程上运行,您可以为每个 ServerClass 实例创建一个连接并将生命周期定义为“会话”,因此每个新会话都会产生一个新的 ServerMethod 类实例并拥有自己的连接,这样您就不必担心编写服务器方法的方式,因为它们将始终拥有自己的“独占”连接。

    【讨论】:

    • 看起来这会导致代码重复(并忘记输入/退出) - 将 TMonitor.Enter/TMonitor.Exit 放在 LoginDM.Login 方法中会减少这种情况
    • @mjn 是的,这样会更好。
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多