【问题标题】:Connection per user每个用户的连接
【发布时间】:2012-05-26 22:05:02
【问题描述】:

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

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

在 C# 中我会使用这个:

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

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

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(); 返回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; } } }

【问题讨论】:

  • Static 将为每个用户使用相同的连接,系统中有一个静态对象的单个实例。但是为什么你想要这个要求,如果连接没有返回到连接池或事务锁,如果你有高并发性,维护单个连接可能会导致问题
  • 你的概念违背了微软关于如何使用连接和使用连接池的建议。您可以阅读更多here:“我们强烈建议您在使用完毕后始终关闭连接,以便将连接返回到池中”
  • @Mike 你为什么要这样做?

标签: c# asp.net mysql


【解决方案1】:

你应该

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

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

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

【讨论】:

  • Fabske 问题是你创建了临时表,它们只保留连接,你关闭它你会丢失 tmp db
  • 是的,这就是为什么它是一个临时表。如果您需要保留它,只需创建一个标准表。请记住,连接也可能由于网络错误而中断,因此您不能假设您的临时表将始终可用...
【解决方案2】:

首先,请注意:您绝对不应该按照您的要求行事;这是一个非常糟糕的主意,尤其是在应用于网站时。大多数数据库库使用连接池策略来减少资源使用,并且保持连接打开的时间比需要的时间长会造成混乱。当没有明确的方法知道连接何时完成时,它也会让您容易泄漏资源。

如果你坚持的话……

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

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

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

【讨论】:

  • 好的,我怎样才能创建并保留一个临时表新用户
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2022-08-20
    • 1970-01-01
    • 2012-01-18
    • 2019-04-04
    相关资源
    最近更新 更多