我有一个长期运行的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()
有时候会成为无操作:SQLCommand.Prepare()