我有客户端服务器应用程序,服务器端是Azure WCF服务,其中包含SQL azure数据库中的数据.客户端是Windows 7 silverlight应用程序。客户端和服务器通过WCF进行通信。服务器向存储在Azure SQL数据库中的客户端提供数据。
最近,我遇到了一些关于池的问题。每次客户端请求到达时,我都在创建新对象。我没有关闭这个连接,很快就遇到了异常:
超时过期。从池获得连接之前经过的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。
我的问题是-如何处理与DB的连接对象?我应该为每个客户端请求创建一个连接对象,还是应该创建单例对象来处理对db的所有调用?它甚至有可能-连接对象超时后,是否在一段时间或其他什么?
我使用的是SQLConnection对象:
private static SqlConnection connection
{
get
{
SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder
{
DataSource = DB_SOURCE,
InitialCatalog = DB_NAME,
Encrypt = false,
TrustServerCertificate = false,
UserID = DB_USER,
Password = DB_PASS,
};
SqlConnection c = new SqlConnection(connectionStringBuilder.ToString());
c.Open();
return c;
}
}
public static void execute(String query)
{
try
{
SqlCommand com = new SqlCommand(query, connection);
com.ExecuteNonQuery();
}
finally
{
connection.Close();
}
}发布于 2012-01-31 01:14:07
我同意威克托·齐奇拉、托比亚斯和赫夫·罗杰罗提供的答案。他们解释说:
connect属性)不返回您期望的原始SqlConnection,因此原始连接不会关闭。SqlConnection,只在需要时保持打开,并在完成时关闭它们。以下是一个完整的解决方案:
private static string _connectionString = string.Empty;
private static string connectionString
{
get
{
if (string.IsNullOrEmpty(_connectionString))
{
_connectionString = new SqlConnectionStringBuilder
{
DataSource = DB_SOURCE,
InitialCatalog = DB_NAME,
Encrypt = false,
TrustServerCertificate = false,
UserID = DB_USER,
Password = DB_PASS,
}.ToString();
}
return _connectionString;
}
}
public static void Execute(String query)
{
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}发布于 2012-01-30 04:06:33
默认情况下,SQL连接是池的。因此,当你需要的时候,你应该“创造”它们,当你需要的时候,你应该摧毁它们。(如果使用using而不是try/finally,代码会更简单。)
发布于 2012-01-29 18:18:24
您在代码中引用了两次connection,因此您有两个不同的连接,因为get之三总是创建一个新的连接!
因此,后者被创建,然后立即被处理,但前者没有关闭。
至少重写您的代码以:
public static void execute(String query) {
SqlConnection c = null;
try {
c = connection;
using ( SqlCommand com = new SqlCommand(query, c);
com.ExecuteNonQuery();
}
finally {
if ( c!=null)
c.Close();
}
} https://stackoverflow.com/questions/9055470
复制相似问题