我正在使用下面的代码,我想要做的是在用户登录时使用相同的连接。现在我对使用的理解是它处理连接,但我真正想要的是什么要做的是当用户登录时,创建连接并让他们使用该特定连接。
下面是我知道用于在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; } } }
答案 0 :(得分:0)
你应该
.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都没有使用临时表,而是应用类似于我建议的技术