【发布时间】:2019-09-17 10:44:40
【问题描述】:
请给专家意见,参考下面基于键值对的静态排序列表。
Method1 用于关闭连接使用使用键访问排序列表的方法。
Method2 用于关闭连接,在 Sorted List 上使用 lock 语句并通过索引访问它。
请指导哪种方法更好,因为成千上万的用户同时在 Web 应用程序上创建了数千个连接。注意,不加锁的索引访问会引发Index out of bound exception。
internal class ConnA
{
static internal SortedList slCons = new SortedList();
internal static bool CreateCon(string ConnID)
{
string constring = "sqlconnectionstring_containing_DataSource_UserInfo_InitialCatalog";
SqlConnection objSqlCon = new SqlConnection(constring);
objSqlCon.Open();
bool connSuccess = (objSqlCon.State == ConnectionState.Open) ? true : false;
if (connSuccess && slCons.ContainsKey(ConnID) == false)
{
slCons.Add(ConnID, objSqlCon);
}
return connSuccess;
}
//Method1
internal static void CloseConnection(string ConnID)
{
if (slCons.ContainsKey(ConnID))
{
SqlConnection objSqlCon = slCons[ConnID] as SqlConnection;
objSqlCon.Close();
objSqlCon.Dispose();
objSqlCon.ResetStatistics();
slCons.Remove(ConnID);
}
}
//Method2
internal static void CloseConnection(string ConnID)
{
lock (slCons)
{
int nIndex = slCons.IndexOfKey(ConnID);
if (nIndex != -1)
{
SqlConnection objSqlCon = (SqlConnection)slCons.GetByIndex(nIndex);
objSqlCon.Close();
objSqlCon.Dispose();
objSqlCon.ResetStatistics();
slCons.RemoveAt(nIndex);
}
}
}
internal class UserA
{
public string ConnectionID { get { return HttpContext.Current.Session.SessionID; } }
private ConnA objConnA = new objConnA();
public void ConnectDB()
{
objConnA.CreateCon(ConnectionID));
}
public void DisConnectDB()
{
objConnA.CloseConnection(ConnectionID));
}
}
【问题讨论】:
-
不要将数据库连接存储在静态列表中。您正在手动进行某种连接池,不要重新发明轮子,让 .net 框架在不再使用时释放其资源。
-
不要锁定 slCons:更喜欢创建一个唯一的对象,例如“object locker = new object();”并锁定它,不做任何其他事情。
-
每当您有一个由多个进程共享的列表时,您必须在添加/删除时始终锁定,以防止出现索引错误等共享问题。该过程可以在添加/删除中间切换,最终访问错误的索引。
-
@jdweng,对。即使我们通过key访问我们也需要锁定?
标签: c# static locking keyvaluepair sortedlist