我有一个相当简单的Web服务,它从sql server公开数据。它将用于在两个不同的数据库(SQL Server和Lotus Notes)之间同步数据。我们正处于测试Web服务的阶段,并以20 req./min进行轮询,前2分钟就可以了,但是在第二个之后,我们得到一个异常,显然是连接(到数据库) )无法打开(超时)。
您有关于做什么或在哪里看的提示/建议吗? Web服务已使用C#/ .NET编程,在构建(Web服务)对象期间打开与db的连接,在处理对象时关闭。
我考虑过使用global.asax来“分享”这种联系,但经过一些谷歌搜索后,我发现大多数人发现这是一个坏主意,我正在寻找不同的解决方案。
PS。服务以同步方式汇集,同时不存在2个请求
CNC中 (在前2个关于汇集的anwsers之后) 这是当前代码:
public class DataService : System.Web.Services.WebService
{
private SqlConnection conn = new SqlConnection("Data Source=ip;database=database;uid=user;pwd=secret;");
public DataService ()
{
try
{
conn.Open();
}
catch (Exception dbconn)
{
throw new SoapException("Couldn't open connection to database:" + dbconn.Message + " More info at: " + dbconn.HelpLink, errorCode);
}
//Uncomment the following line if using designed components
//InitializeComponent();
}
~DataService()
{
conn.Close();
}
[WebMethod(Description="Gets all Person changes(from last week)")]
public Person[] GetPerson()
{
Person[] Personen = null;
SqlCommand sqlcmd = conn.CreateCommand();
sqlcmd.CommandText = "SELECT * FROM Person";
SqlDataReader Rows = sqlcmd.ExecuteReader();
while (Rows.Read())
{
//doSomething
}
Rows.Close();
return Personen;
}
}
答案 0 :(得分:4)
听起来你已经筋疲力尽了连接池 - 最好的选择是使用块来包装SQL调用,因此松散:
using( SqlConnection con = new SqlConnection( "MyConnectionString" ) )
{
con.Open();
using( SqlCommand cmd = new SqlCommand( "MyStoredProcedure", con ) )
{
// Do stuff with the Command
}
}
这将允许您同时提供与连接池大小相同数量的请求。
因此,编辑后的代码变为:
public class DataService : System.Web.Services.WebService
{
[WebMethod(Description="Gets all Person changes(from last week)")]
public Person[] GetPerson()
{
Person[] Personen = null;
using( SqlConnection conn = new SqlConnection("Data Source=ip;database=database;uid=user;pwd=secret;") )
{
using( SqlCommand sqlcmd = conn.CreateCommand() )
{
sqlcmd.CommandText = "SELECT * FROM Person";
SqlDataReader Rows = sqlcmd.ExecuteReader( CommandBehavior.CloseConnection ); // This will close the DB connection ASAP
while (Rows.Read())
{
//doSomething
}
Rows.Close();
}
}
return Personen;
}
}
答案 1 :(得分:0)
请参阅此链接Best Practices for Using ADO.NET,其中包含指向SQL Server Connection Pooling (ADO.NET)的链接 - 确保您确实正确使用了连接池。