每个用户的连接
本文关键字:连接 用户 | 更新日期: 2023-09-27 18:34:45
我正在使用下面的代码,我想做的是在整个用户登录期间为用户使用相同的连接。 现在我对使用的理解是它处理连接,但我真正想做的是当用户登录时,创建一个连接并让他们使用该特定连接。
下面是我知道用于在 C# 中设置连接的代码,我会将 [ThreadStatic] 属性应用于public static MySqlConnection ATCrawlerConnection
,但是您如何在 aspx 中实现类似的功能,基本上为每个用户创建一个连接,然后访问和限制该用户的连接?
在 C# 中,我会使用这个:
MySQLProcessing.MySQLStatic.ATCrawlerConnection MySQLProcessing.MySQLStatic.OpenCon("10.2", 3306, "user", "pw"(;public static MySqlConnection ATCrawlerConnection { get; set; }
public static MySqlConnection OpenCon(string ServerAddress, int PortAddress, string UserID, string Password( { MySqlConnection masterOpenCON = new MySqlConnection("server=" + ServerAddress + ";端口=" + 端口地址 + ";UID=" + 用户 ID + ";PASSWORD=" + Password(;//+ ";connectiontimeout=" + ConnectionTimeOut + ";"(; masterOpenCON.Open((; 返回主开康; }
public static DataTable StoreProcedureDTTable(string mysqlQuery, string[] CommandArgs, string queryName) { lock (_object) { using (MySqlConnection cn = new MySqlConnection(applicationStringClass.AuthMySQLConnector)) { DataTable DTTableTable = new DataTable(); try { MySqlCommand MySQLCommandFunc = new MySqlCommand(mysqlQuery); MySQLCommandFunc.Connection = cn; MySQLCommandFunc.CommandType = CommandType.StoredProcedure; foreach (string args in CommandArgs) { string[] splitArgs = args.Split('|'); MySQLCommandFunc.Parameters.AddWithValue(splitArgs[0], splitArgs[1]); } MySqlDataAdapter DataDTTables = new MySqlDataAdapter(MySQLCommandFunc); DataTable DataDTTablesDT = new DataTable(); DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; } catch (Exception ex) { } return DTTableTable; } } }
你应该
- 在需要时创建连接,并在不使用时立即将其释放
- 为所有连接保留相同的连接字符串
- 不要在不同的线程上共享连接,否则如果 2 个线程同时使用该连接,则会出现错误。静态方法不会有这个问题,因为你放了锁,但如果服务器负载太重,等待获取锁会浪费很多时间。
.NET 已经过优化,每次创建新连接时都不会打开连接,这称为"连接池"。应保留相同连接字符串的原因是连接池使用它来"缓存"连接。因此,如果连接字符串更改(即应用程序名称(,它将创建一个新连接。
因此,不要尝试执行已经完成的操作,只需创建一个新连接并在完成批量查询后尽快将其释放即可。
首先,需要注意的是:你绝对不应该做你所要求的;这是一个非常糟糕的主意,尤其是当应用于网站时。大多数数据库库使用连接池策略来减少资源使用,并且保持连接打开的时间超过需要的时间会搞砸。当没有明确的方法来知道连接何时完成时,它还会使资源泄漏
。不过,如果你坚持...
每当您想在 ASP.NET 中执行"针对给定用户"的操作时,您通常会寻找会话状态跟踪。Session 对象可用于存储 ASP.NET 基于每个用户跟踪的任意信息。(此处的"用户"是指访问该网站的具有特定cookie的浏览器。
通过会话对象设置和存储每用户连接非常简单,如 Microsoft 的此会话状态概述页中所述。
棘手的部分是知道何时关闭它。如果您的网站有一些明确定义的登录和退出策略,这是一个好的可能性。但是,您不能假设您的用户将始终访问该注销页面。会话状态存储在工作进程的内存中,IIS 将回收该内存(主要是为了缓解此确切问题(,但这是非常不确定的。这是不鼓励在会话状态下存储开放资源的主要原因之一。
你不能通过打破 ASP.NET(或任何其他技术(应该被使用的方式来解决问题,由构建它的人定义。如果你想为用户存储临时数据(你在原来的帖子中没有提到(,你可以使用其他策略,比如在你的数据库中使用物理表,使用 ASP.NET 的On_SessionEnd事件删除所有用户相关的数据,或者在 proc 内存中移动临时数据。
您实际上可以将会话数据存储在数据库中,并且非常确信MySQL和SQL Server都没有使用临时表,而是应用类似于我建议的技术的东西。