2013-02-18 48 views
4

我想要找出在我的Delphi datasnap服务器中放置以下逻辑的最佳/“正确”位置。单个用户的多个连接

用户连接到服务器,并使用提供的凭据使用集中式AuthorizationDatabase(Oracle数据库)验证它们。如果他们实际上是一个有效的用户,那么我希望根据授权存储库所说的内容(可能是另一个主机,数据库,用户名,密码)给他们一个数据实际驻留位置的连接。

我有自己的服务器类,这是服务器生命周期的AuthorizationDatabase,因为没有人可以进入,而无需在那里验证。这是否会造成并发问题? 10位用户同时登录验证,这项工作是否正常?

我有一个基本服务器模块,所有会话级别数据模块派生自具有应用程序连接。应用程序连接参数可以根据用户登录而更改。

我遇到的问题是将授权/验证/新DB参数分配过程的位置。

这种两步数据库方法最适合哪里?这似乎相当普遍,用户在一个地方被验证,但他们最终要访问的数据在另一个地方。

在回顾这些例子时,我没有看到明显的地方。

回答

2

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

但你可以有登录一个集中的地方,只是使它线程安全的,这会做:

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

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

+1

看起来这可能会导致代码重复(并忘记进入/退出) - 将TMonitor.Enter/TMonitor.Exit放入LoginDM.Login方法中会减少这种情况 – mjn 2014-05-23 09:40:22

+0

@mjn是的,那样会更好。 – 2014-05-23 12:45:15