0

我正在使用下面的代码,我想要做的是在用户登录期间使用相同的连接。现在我对使用的理解是它处理连接,但我真正想做的是当用户登录时,创建一个连接并让他们使用该特定连接。

下面是我知道的用于在 C# 中设置连接的代码,我会将 [ThreadStatic] 属性应用于public static MySqlConnection ATCrawlerConnection,但是如何在 aspx 中完成类似的功能,基本上为每个用户创建一个连接,然后访问和限制该连接用户?

在 C# 中,我会使用这个:

MySQLProcessing.MySQLStatic.ATCrawlerConnection MySQLProcessing.MySQLStatic.OpenCon("10.2", 3306, "user", "pw");

公共静态 MySqlConnection ATCrawlerConnection { 获取;放; }

公共静态 MySqlConnection OpenCon(字符串 ServerAddress,int PortAddress,字符串 UserID,字符串密码) { MySqlConnection masterOpenCON = new MySqlConnection("server=" + ServerAddress + ";Port=" + PortAddress + ";UID=" + UserID + ";PASSWORD=" + Password);// + ";connectiontimeout=" + ConnectionTimeOut + " ;"); masterOpenCON.Open(); 返回masterOpenCON; }

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; } } }
4

3 回答 3

0

根据构建它的人的定义,您无法通过破坏 ASP.NET(或任何其他相关技术)的使用方式来解决您的问题。如果您想为用户存储临时数据(您在原始帖子中没有提到),您可以使用其他策略,例如在您的数据库中使用物理表并使用 ASP.NET 的 On_SessionEnd 事件删除所有用户-related 数据,或将临时数据存储在 proc 内存中。
您实际上可以将您的会话数据存储在 db中,并且我非常确信 mysql 和 sql server 都没有使用临时表,而是应用类似于我建议的技术的东西

于 2012-05-19T19:35:06.853 回答
0

你应该

  • 需要时创建连接,不使用时立即丢弃
  • 为所有连接保持相同的连接字符串
  • 不要在不同的线程上共享连接,否则如果 2 个线程同时使用连接会出错。你的静态方法不会有这个问题,因为你放了锁,但是如果服务器负载太重,很多时间会因为等待获取锁而松散。

.NET 已经优化为每次创建新连接时都不会打开连接,这称为“连接池”。您应该保留相同的连接字符串的原因是连接池使用它来“缓存”连接。因此,如果您更改连接字符串(即应用程序名称),它将创建一个新连接。

所以不要尝试做已经完成的事情,只需创建一个新连接并在完成一批查询后尽快处理它。

于 2012-05-19T18:49:26.740 回答
0

首先,一个警告:你绝对应该做你所要求的;这是一个非常糟糕的主意,尤其是在应用于网站时。大多数数据库库使用连接池策略来减少资源使用,并且保持连接打开的时间超过需要的时间会搞砸。当没有明确的方法知道连接何时完成时,它也会让您容易泄漏资源。

如果你坚持,虽然...

每当您想在 ASP.NET 中为“给定用户”做某事时,您通常都在寻找会话状态跟踪。Session 对象可用于存储 ASP.NET 基于每个用户跟踪的任意信息。(此处的“用户”是指带有特定 cookie 的浏览器访问该网站。)

通过 Session 对象设置和存储每个用户的连接非常简单,如Microsoft的此Session State Overview页面中所述。

棘手的部分是知道何时关闭它。如果您的站点有一些明确定义的登录和退出策略,那么这是一个很好的可能性。但是您不能假设您的用户将始终访问该注销页面。会话状态存储在工作进程的内存中,IIS 将对其进行回收(主要是为了缓解这个确切的问题),但这是非常不确定的。这是不鼓励将开放资源存储在会话状态中的主要原因之一。

于 2012-05-19T18:51:36.993 回答