【发布时间】:2012-03-31 03:05:57
【问题描述】:
当尝试通过 ASP.NET 在线连接到 MSSQL 数据库时,当两个或更多人同时连接时,我会得到以下信息:
ExecuteReader 需要一个打开且可用的连接。连接的当前状态是 Connecting。
该站点在我的本地主机服务器上运行良好。
这是粗略的代码。
public Promotion retrievePromotion()
{
int promotionID = 0;
string promotionTitle = "";
string promotionUrl = "";
Promotion promotion = null;
SqlOpenConnection();
SqlCommand sql = SqlCommandConnection();
sql.CommandText = "SELECT TOP 1 PromotionID, PromotionTitle, PromotionURL FROM Promotion";
SqlDataReader dr = sql.ExecuteReader();
while (dr.Read())
{
promotionID = DB2int(dr["PromotionID"]);
promotionTitle = DB2string(dr["PromotionTitle"]);
promotionUrl = DB2string(dr["PromotionURL"]);
promotion = new Promotion(promotionID, promotionTitle, promotionUrl);
}
dr.Dispose();
sql.Dispose();
CloseConnection();
return promotion;
}
我可以知道可能出了什么问题以及如何解决它吗?
编辑:别忘了,我的连接字符串和连接都是静态的。我相信这就是原因。请指教。
public static string conString = ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString;
public static SqlConnection conn = null;
【问题讨论】:
-
不要在像 ASP.NET 这样的多线程环境中使用共享/静态连接,因为您正在生成锁或异常(打开的连接过多等)。将您的 DB-Class 扔进垃圾桶,然后在您需要的地方创建、打开、使用、关闭、处置 ado.net 对象。看看 using 语句。
-
你能给我详细介绍一下 SqlOpenConnection(); 和 sql.ExecuteReader();功能?..
-
private void SqlOpenConnection() { try { conn = new SqlConnection(); conn.ConnectionString = conString; conn.Open(); } catch (SqlException ex) { throw ex; } }
-
@GuoHongLim:我忘了说即使是静态的
conString也不会增加性能,因为it's cached by default 无论如何(作为当前应用程序的每个配置值)。 -
...只是让它成为一个已知的未知数:确保您的数据库事务处理/工作单元正确,留给读者作为练习。
标签: c# .net sql-server ado.net database-connection