每个用户的连接

时间:2012-05-19 18:17:29

标签: c# asp.net mysql

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

下面是我知道用于在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 + ";Port=" + PortAddress + ";UID=" + UserID + ";PASSWORD=" + Password);// + ";connectiontimeout=" + ConnectionTimeOut + ";"); masterOpenCON.Open(); return 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; } } }

3 个答案:

答案 0 :(得分:0)

你应该

  • 在您需要时创建连接,并在不使用时立即处理
  • 为所有连接保留相同的连接字符串
  • 不要在不同的线程上共享连接,否则如果2个线程同时使用该连接,则会出错。你的静态方法不会出现这个问题,因为你放了锁,但是如果服务器负载过重,那么等待获取锁的时间会很长。

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

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

答案 1 :(得分:0)

首先,一个警告:你绝对不应该做你所要求的事情;这是一个非常糟糕的主意,特别是在应用于网站时。大多数数据库都使用连接池策略来减少资源使用,并保持连接打开的时间长于所需的混乱。当没有明确的方法知道连接何时完成时,它还会让您泄漏资源。

如果你坚持,不过......

每当您想在ASP.NET中为“给定用户”执行某些操作时,通常都会查找会话状态跟踪。 Session对象可用于存储ASP.NET基于每个用户跟踪的任意信息。 (“用户”在这里表示访问该网站的特定cookie的浏览器。)

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

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

答案 2 :(得分:0)

你不能通过破坏构建它的人的定义来打破ASP.NET(或任何其他重要技术)的使用方式来解决你的问题。如果您想为用户存储临时数据(您在原始帖子中未提及),您可以使用其他策略,例如在您的数据库中使用物理表并使用ASP.NET的On_SessionEnd事件来删除所有用户相关数据,或在proc内存中stro temp数据。
你实际上可以store ur session data within the db,我非常相信 mysql和sql server都没有使用临时表,而是应用类似于我建议的技术