C#MMO应用程序中的SqlCommand超时
我有一个C#项目,它以异步方式使用TCP套接字 每个请求都来自客户端,并从SQL Server存储过程询问问题,在问题结束后打开和关闭SQL连接 我使用了以下代码:C#MMO应用程序中的SqlCommand超时,c#,sql-server,connection-timeout,tcpsocket,mmo,C#,Sql Server,Connection Timeout,Tcpsocket,Mmo,我有一个C#项目,它以异步方式使用TCP套接字 每个请求都来自客户端,并从SQL Server存储过程询问问题,在问题结束后打开和关闭SQL连接 我使用了以下代码: using (var con = new SqlConnection(setting.ConnectionString)) { try { //some codes (edited) SqlCommand command = new SqlCommand(con); c
using (var con = new SqlConnection(setting.ConnectionString))
{
try
{
//some codes (edited)
SqlCommand command = new SqlCommand(con);
command.CommandText = "procedurename1";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@name", sb.ToString()));
SqlDataAdapter adapter = new SqlDataAdapter(command);
try
{
adapter.Fill(dataSet);
}
catch (Exception ex)
{
con.Close();
con.Dispose();
throw ex;
}
finally {
con.Close();
con.Dispose();
}
}
catch(Exception ex)
{}
finally
{
con.close();
con.dispose();
}
}
我用过
netstat -a -n | find /c "1433"
计算打开和关闭的SQL连接数
问题是SQL连接数增加了,很少减少和倒计时
主要问题是,当我的程序在30分钟左右的大量请求下工作时,我会
SqlCommand超时错误(默认时间为30秒)
重新启动我的C#程序后,SqlCommand
超时将消失
这是我的程序还是SQL Server方面的问题
请记住,它总是在SQL Server中调用存储过程,而不是执行查询
直接的
主要方法:
public void main()
{
Task.Factory.StartNew(() =>
{
allDone.Reset();
mySocket.AcceptAsync(e);
allDone.WaitOne();
});
}
public void e_Completed(object sender, SocketAsyncEventArgs e)
{
var socket = (Socket)sender;
ThreadPool.QueueUserWorkItem(HandleTcpRequest, e.AcceptSocket);
e.AcceptSocket = null;
socket.AcceptAsync(e);
}
public void HandleTcpRequest(object state)
{
//do some code and connection to SQL server
DLL.Request httprequest = new DLL.Request(dataSet.Tables[0], fileDt);
DLL.IHttpContext _context = new DLL.HttpContext(httprequest);
_context.GetResults();
}
我将根据我们所能看到的有限的Sql相关代码的编写方式做一个长期的尝试,因为我们看不到“//一些代码” 我猜一些可丢弃的东西,比如SqlCommand、DataReader、SqlDataAdapter、TransactionScope等,不在“使用”块中,所以它们在数据库上保持资源打开状态 还值得一提的是,此类问题可能存在于问题中显示的代码中,或者存在于访问该数据库的任何其他程序中,包括您自己的应用程序和SSM(例如,如果开发人员在窗口中运行未提交的事务) 另外,我建议删除using块中的所有内容,除了“//一些代码”部分 添加更多代码后更新 这是更正后的代码。这将确保资源得到处置,从而防止可能导致问题的资源泄漏
using (var con = new SqlConnection(setting.ConnectionString))
{
//some codes (edited)
using (SqlCommand command = new SqlCommand(con))
{
command.CommandText = "procedurename1";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@name", sb.ToString()));
using (var adapter = new SqlDataAdapter(command))
{
adapter.Fill(dataSet);
}
}
}
注意,不要再在接球时写“掷骰子”。它会导致堆栈跟踪丢失-只需使用“throw;”
主要问题是,当我的程序在30分钟左右的大量请求下运行时
为了隔离超时的根本问题,我建议独立于TCP套接字调用测试存储过程的sql查询30分钟
并记录超时异常详细信息以供检查
在30分钟内运行以下查询以模拟您的工作环境:
public void RunQuery()
{
using (var con = new SqlConnection(setting.ConnectionString))
{
try
{
//some codes
}
catch(SqlException ex)
{
//test for timeout
if (ex.Number == -2) {
Console.WriteLine ("Timeout occurred");
// log ex details for more inspection
}
}
}
}
阅读
当您使用异步调用时,我建议您尝试将异步数据库调用与基于任务的异步编程模型一起使用您的意思是SqlDataAdapter可能会泄漏资源,并且应该在使用中???这可能是SQL命令超时的原因?我会测试它,如果不再发生,我会接受你的问题。希望它能起作用。谢谢,还有一个问题。我应该使用我在程序中使用的每个dll的发布版本,并构建发布版本吗?这和问题有关吗?首先要感谢你们的同情心,是的,我真的很有压力,我得说我的程序使用了另一个DLL,它必须有SqlConnections。我已经编辑了使用另一个DLL的代码。//之后的行执行一些代码并连接到SQL Server 36小时,并且没有更新。。。进展如何?进展如何?“我的回答没有什么用处吗?”里查迪西莫还没有。我已经更改了代码的某些部分,并在套接字部分使用while true和检查同步套接字。正在等待results@Richardissimo我找到了另一个解决方案,用于无法关闭的集合。sqlconnection.clearlallpool()