我有一个长期运行的 Windows 服务,它不断接收数据并对其进行处理,然后将其放入数据库中。我使用存储过程进行复杂的操作,但其中一些有很多参数。
我知道这是建议的“最佳实践”:
using(IDbConnection connection = GetConnection())
{
connection.Open();
// Do stuff
connection.Close();
}
导致短暂的连接,但充分利用连接池。然而,这种做法似乎真的否定了存储过程的好处。我现在有这样的事情:
while(true)
{
var items = GetData(); // network I/O
using(IDbConnection conn = GetConn())
{
connection.Open();
var tran = connection.BeginTransaction();
var preparedStatement1 = SQL.Prepare(connection, "...", ...);
var preparedStatement2 = SQL.Prepare(connection, "...", ...);
var preparedStatement3 = SQL.Prepare(connection, "...", ...);
foreach(var item in items)
{
// loop which calls SQL statements.
}
connection.Close();
}
}
我真的觉得我应该在 while 循环之外打开连接,这样它才能长时间保持活动状态;并在进入循环之前准备语句。这将给我使用存储过程的全部好处:
using(IDbConnection conn = GetConn())
{
connection.Open();
var tran = connection.BeginTransaction();
var preparedStatement1 = SQL.Prepare(connection, "...", ...);
var preparedStatement2 = SQL.Prepare(connection, "...", ...);
var preparedStatement3 = SQL.Prepare(connection, "...", ...);
while(!service.IsStopped)
{
var items = GetData(); // network I/O
foreach(var item in items)
{
// loop which calls SQL statements.
}
}
connection.Close();
}
所以问题是,存储过程的性能优势是否超过了长时间打开连接的“风险”?最佳实践似乎从未提及准备好的语句,而 MSDN 文档(我正在使用 SQL Server)似乎暗示Prepare()
ing 有时是无操作的:SQLCommand.Prepare()