- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
当尝试通过 ASP.NET 在线连接到 MSSQL 数据库时,当两个或更多人同时连接时,我将得到以下信息:
ExecuteReader requires an open and available Connection. The connection's current state is 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;
最佳答案
很抱歉一开始只发表评论,但我几乎每天都发布类似的评论,因为许多人认为将 ADO.NET 功能封装到 DB 类中是明智的(10 年前我也是) .大多数情况下,他们决定使用静态/共享对象,因为它似乎比为任何操作创建新对象更快。
无论是在性能方面还是在故障安全方面,这都不是一个好主意。
ADO.NET 在内部管理 ADO-NET Connection-Pool 中与 DBMS 的底层连接是有充分理由的。 :
In practice, most applications use only one or a few differentconfigurations for connections. This means that during applicationexecution, many identical connections will be repeatedly opened andclosed. To minimize the cost of opening connections, ADO.NET uses anoptimization technique called connection pooling.
Connection pooling reduces the number of times that new connectionsmust be opened. The pooler maintains ownership of the physicalconnection. It manages connections by keeping alive a set of activeconnections for each given connection configuration. Whenever a usercalls Open on a connection, the pooler looks for an availableconnection in the pool. If a pooled connection is available, itreturns it to the caller instead of opening a new connection. When theapplication calls Close on the connection, the pooler returns it tothe pooled set of active connections instead of closing it. Once theconnection is returned to the pool, it is ready to be reused on thenext Open call.
所以显然没有理由避免创建、打开或关闭连接,因为实际上根本没有创建、打开和关闭连接。这“仅”是连接池知道何时可以重用连接的标志。但这是一个非常重要的标志,因为如果连接“正在使用”(连接池假设),则必须为 DBMS 打开一个新的物理连接,这是非常昂贵的。
因此,您没有获得任何性能提升,反而适得其反。如果达到指定的最大池大小(默认值为 100),您甚至会遇到异常(打开的连接过多...)。因此,这不仅会极大地影响性能,而且会成为严重错误和(不使用事务)数据转储区域的来源。
如果您甚至使用静态连接,您就是在为每个试图访问该对象的线程创建一个锁。 ASP.NET 本质上是一个多线程环境。因此,这些锁很有可能充其量会导致性能问题。实际上迟早你会遇到许多不同的异常(比如你的ExecuteReader 需要一个开放且可用的连接)。
结论:
using-statement
隐式处理和关闭(在连接的情况下)这不仅适用于 Connections(尽管最引人注目)。每个对象实现 IDisposable
应在 System.Data.SqlClient
命名空间中进行处理(最简单的 using-statement
)。
以上所有内容都反对封装和重用所有对象的自定义 DB 类。这就是为什么我评论要丢弃它的原因。那只是一个问题来源。
编辑:这是您的retrievePromotion
-方法的可能实现:
public Promotion retrievePromotion(int promotionID)
{
Promotion promo = null;
var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MainConnStr"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
var queryString = "SELECT PromotionID, PromotionTitle, PromotionURL FROM Promotion WHERE PromotionID=@PromotionID";
using (var da = new SqlDataAdapter(queryString, connection))
{
// you could also use a SqlDataReader instead
// note that a DataTable does not need to be disposed since it does not implement IDisposable
var tblPromotion = new DataTable();
// avoid SQL-Injection
da.SelectCommand.Parameters.Add("@PromotionID", SqlDbType.Int);
da.SelectCommand.Parameters["@PromotionID"].Value = promotionID;
try
{
connection.Open(); // not necessarily needed in this case because DataAdapter.Fill does it otherwise
da.Fill(tblPromotion);
if (tblPromotion.Rows.Count != 0)
{
var promoRow = tblPromotion.Rows[0];
promo = new Promotion()
{
promotionID = promotionID,
promotionTitle = promoRow.Field<String>("PromotionTitle"),
promotionUrl = promoRow.Field<String>("PromotionURL")
};
}
}
catch (Exception ex)
{
// log this exception or throw it up the StackTrace
// we do not need a finally-block to close the connection since it will be closed implicitly in an using-statement
throw;
}
}
}
return promo;
}
关于c# - ExecuteReader 需要一个打开且可用的连接。连接的当前状态是 Connecting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705637/
使用 caret::train() 运行逻辑回归模型时出现问题。LR = caret::train(Satisfaction ~., data= log_train, method = "glm",
我正在尝试将nginx容器作为我所有网站和Web服务的主要入口点。我设法将portainer作为容器运行,并且可以从互联网上访问它。现在,我正在尝试访问由另一个Nginx容器托管的静态网站,但这样做失
我有一个在 Windows XP SP3 x86 上运行的 Visual Studio 2008 C# .NET 3.5 应用程序。在我的应用程序中,我有一个事件处理程序 OnSendTask 可以同
我在 Eclipse 中创建了作为独立程序执行的此类,它可以毫无问题地连接所有 http URL(例如:http://stackoverflow.com),但是当我尝试连接到 https(例如 htt
我在我的 nginx 错误日志中收到大量以下错误: connect() failed (111: Connection refused) while connecting to upstream 我的
我正在尝试将新的 log4j2 与 Socket Appender 一起使用,但我有点不走运。这是我的 XML 配置文件:
我目前正在尝试寻找 Android 应用程序后端的替代方案。目前,我使用 php servlet 来查询 Mysql 数据库。数据库(Mysql)托管在我大学的计算机上,因此我无法更改任何配置,因为我
类MapperExtension有一些方法,before_insert, before_update, ...都有一个参数connection. def before_insert(self, map
嗨,我正在尝试更改位于连接库 (v 5.5) 中的文档的文档所有者,我仍在等待 IBM 的回复,但对我来说可能需要太长时间,这就是我尝试的原因逆向工程。 我尝试使用标准编辑器 POST 请求将编辑器更
我在 nginx( http://52.xx.xx.xx/ )上访问我的 IP 时遇到 502 网关错误,日志只是这样说: 2015/09/18 13:03:37 [error] 32636#0: *
我要实现 Connected-Component Labeling但我不确定我应该以 4-connected 还是 8-connected 的方式来做。我已经阅读了大约 3 种 Material ,但
我在Resources ->JMS ->Connection Factories下有两个连接工厂。 1) 连接工厂 2)集成连接工厂 我想修改两个连接工厂下连接池的最大连接数。资源 ->JMS ->连
我在将 mongoengine 合并到我的 django 应用程序时遇到问题。以下是我收到的错误: Traceback (most recent call last): File "/home/d
上下文 我正在关注 tutorial on writing a TCP server last week in Real World Haskell .一切顺利,我的最终版本可以正常工作,并且能够在
我在访问我的域时遇到了这个问题:我看到了我的默认 http500 错误 django 模板正在显示。 我有 gunicorn 设置: command = '/usr/local/bin/gunicor
我更换了电脑,并重新安装了所有版本:tomcat 8 和 6、netbeans 8、jdk 1.7、hibernate 4.3.4,但是当我运行 Web 应用程序时,出现此错误。过去使用我的旧电脑时,
您好,我是这个项目的新手,我在 CentOS7 ec2 实例上托管它时遇到问题。当我访问我的域时出现此错误: 2017/02/17 05:53:35 [error] 27#27: *20 connec
在开始之前,我已经查看了所有我能找到的类似问题,但没有找到解决我的问题的方法。 我正在运行 2 个 docker 容器,1 个用于 nginx,1 个用于 nodejs api。我正在使用 nginx
使用 debian 包将 kaa -iot 平台配置为单节点时。我收到以下错误。 himanshu@himpc:~/kaa/deb$ sudo dpkg -i kaa-node-0.10.0.deb
我是我公司开发团队的成员,担任管理员角色。我可以通过 https://developer.apple.com/ 访问团队的成员(member)中心 但是,当我尝试在 https://itunescon
我是一名优秀的程序员,十分优秀!