我有一个非常基本的C#控制台应用程序,它连接到数据库,执行查询,关闭连接,并退出应用程序。
问题是,该应用程序需要大约3秒才能退出。
我已经显示了每个步骤的时间,以了解它为什么运行缓慢而且在任何处理期间都没有,只是当它退出应用程序时。
有谁知道如何加快速度?
打开连接:94ms
26:OK
关闭连接:356ms
封闭连接:357ms
退出:358ms
[退出前延迟约3秒]
using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
namespace CheckSQL
{
class Program
{
static Stopwatch watch = new Stopwatch();
static void Main(string[] args)
{
if (args.Length == 0) return;
watch.Start();
string connstring = args[0];
string sqlquery = args[1];
ExecuteScalar(connstring, sqlquery);
watch.Stop();
Console.WriteLine(string.Format("Exiting:{0}ms", watch.ElapsedMilliseconds));
}
private static void ExecuteScalar(string connstring, string sqlquery)
{
SqlConnection sqlconn = new SqlConnection(connstring);
SqlCommand sqlcmd = new SqlCommand(sqlquery, sqlconn);
try
{
Console.WriteLine(string.Format("Opening Connection:{0}ms", watch.ElapsedMilliseconds));
sqlconn.Open();
Console.WriteLine(string.Format("{0}:OK", sqlcmd.ExecuteScalar()));
}
catch (Exception ex)
{
Console.WriteLine(string.Format("0:{0}", ex.Message));
}
finally
{
if (sqlconn.State == ConnectionState.Open)
{
Console.WriteLine(string.Format("Closing Connection:{0}ms", watch.ElapsedMilliseconds));
sqlconn.Close();
Console.WriteLine(string.Format("Closed Connection:{0}ms", watch.ElapsedMilliseconds));
}
}
}
}
}
答案 0 :(得分:2)
我在使用C#Console应用程序时遇到了类似问题,并发现该问题与应用程序退出时清理连接池有关。通过池中的连接,我测量了退出的1.6秒延迟(由外部脚本调用我的EXE计时)。虽然我对解决方案并不完全满意,但我发现在退出之前发出以下内容消除了延迟:
System.Data.SqlClient.SqlConnection.ClearAllPools();
我猜想在您的连接字符串中使用“Pooling = False”也可以做到这一点......但是如果你不需要池化的好处,你就会这样做。
答案 1 :(得分:1)
关闭连接(调用sqlconn.Close()
)仅意味着将其返回到ConnectionPool。
因此退出时仍有一些家务。
3秒似乎有点长,但这里有几个组件(CLR,数据库)。
答案 2 :(得分:0)
我认为不可能以正确的方式做到这一点。你怎么能看到需要一些时间的工作?在这种情况下唯一可行的方法 - 优化algorythm,但你不能这样做。据我所知,你应该在检查一些数据库信息后立即返回控制。您可以通过创建两个流程系统来解决此问题。第一个进程将启动第二个,第二个进程将依次检查数据库中的信息并将结果发送到将与用户通信的第一个进程。所以你总是会在检索结果后返回控制权。第二个过程需要一些时间来终止,但这个事实不应该让你担心,因为那时你会有控制权。