Delphi Indy 10 HTTPServer 将数据库实例绑定到会话
Delphi Indy 10 HTTPServer bind database instance to session
是否有将数据库连接实例绑定到 INDY HTTP Server 会话的最佳实践?
我将常用的会话数据存储在 ARequestInfo.Session.Content.Values
中,但这仅适用于字符串。我当前的数据库对象方法是(TDatabase
只是一个例子class):
- 创建
TDictionary<String,TDatabase>
.
- 为每个会话创建
TDatabase
个实例,并将引用与会话 ID 一起存储在字典中。
- 在会话处理中访问包含在关键部分中的字典是线程安全的。
- 销毁会话时销毁
TDatabase
个实例。
我怀疑我的方法是开销很大的,而且有更优雅的方法可以实现我想要的。如果是这种情况 - 非常欢迎提示。
Session.Content
属性 是一个 TStrings
,它可以容纳字符串和 TObject
指针。您不需要单独的 TDictionary
来将字符串映射到对象,您可以将它们一起存储在 Content
本身中。
或者,您可以从 TIdHTTPSession
派生一个新的 class,将您的数据库连接添加到 class,然后使用 TIdHTTPServer.OnCreateSession
事件创建实例class。然后,要访问数据库连接,只需将任何 TIdHTTPSession
对象类型转换为您的 class 类型。
是否有将数据库连接实例绑定到 INDY HTTP Server 会话的最佳实践?
我将常用的会话数据存储在 ARequestInfo.Session.Content.Values
中,但这仅适用于字符串。我当前的数据库对象方法是(TDatabase
只是一个例子class):
- 创建
TDictionary<String,TDatabase>
. - 为每个会话创建
TDatabase
个实例,并将引用与会话 ID 一起存储在字典中。 - 在会话处理中访问包含在关键部分中的字典是线程安全的。
- 销毁会话时销毁
TDatabase
个实例。
我怀疑我的方法是开销很大的,而且有更优雅的方法可以实现我想要的。如果是这种情况 - 非常欢迎提示。
Session.Content
属性 是一个 TStrings
,它可以容纳字符串和 TObject
指针。您不需要单独的 TDictionary
来将字符串映射到对象,您可以将它们一起存储在 Content
本身中。
或者,您可以从 TIdHTTPSession
派生一个新的 class,将您的数据库连接添加到 class,然后使用 TIdHTTPServer.OnCreateSession
事件创建实例class。然后,要访问数据库连接,只需将任何 TIdHTTPSession
对象类型转换为您的 class 类型。