我正在Asp.net中开发一个应用程序。我有一个处理数据库连接和查询的DBHandler类,DBHandler构造函数打开一个新的OleDBConnection,DBHandler的Dispose函数关闭并处理该连接,通常可以正常工作。
DBHandler类中的某些代码:
readonly OleDbConnection Con;
public DBHandler()
{
string cs = ConfigurationManager.ConnectionStrings["Database"].ConnectionString;
Con = new OleDbConnection(cs);
Con.Open();
}
public void Dispose()
{
Con.Close();
Con.Dispose();
Console.WriteLine("db.dispose");
}
我还有一些请求控制器/处理程序,用于处理获取和发布请求,这是一些示例代码:
public class CountryInfoHandler : HttpMessageHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage message, CancellationToken token)
{
HttpContent content;
HttpResponseMessage response = new HttpResponseMessage();
......
CountryInfo info = null;
using (DBHandler db = new DBHandler())
{
if (db.DoesCountryExist(parsedUri[3]))
{
info = db.Countries[parsedUri[3]];
}
else
{
info = null;
}
}
content = new StringContent(JsonConvert.SerializeObject(info));
content.Headers.ContentType.MediaType = "application/json";
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = content
};
.....
return response;
}
}
除非所有要求同时调用数据库的请求同时出现,否则一切都会正常进行,这时,我得到了System.Runtime.InteropServices.SEHException。我猜这是由于同时打开多个数据库连接引起的,有没有办法防止这种情况的发生或有多个连接而没有任何问题?我目前正在考虑使用OpenConnection和CloseConnection函数使其成为一个静态类,这些类都可以在单个连接上工作,但是还有更好的方法吗?
我找到了解决此问题的方法,我将类设为静态类,并添加了打开和关闭函数,每当它们被称为int(默认为零)时,该值表示使用该类的位置数量是递增还是递减,如果它变为0,则关闭连接,如果它为零并递增,则打开连接。