首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure SQL -单个或多个DB连接?

Azure SQL -单个或多个DB连接?
EN

Stack Overflow用户
提问于 2012-01-29 18:10:42
回答 6查看 3.2K关注 0票数 2

我有客户端服务器应用程序,服务器端是Azure WCF服务,其中包含SQL azure数据库中的数据.客户端是Windows 7 silverlight应用程序。客户端和服务器通过WCF进行通信。服务器向存储在Azure SQL数据库中的客户端提供数据。

最近,我遇到了一些关于池的问题。每次客户端请求到达时,我都在创建新对象。我没有关闭这个连接,很快就遇到了异常:

超时过期。从池获得连接之前经过的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。

我的问题是-如何处理与DB的连接对象?我应该为每个客户端请求创建一个连接对象,还是应该创建单例对象来处理对db的所有调用?它甚至有可能-连接对象超时后,是否在一段时间或其他什么?

我使用的是SQLConnection对象:

代码语言:javascript
复制
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();
            }
        }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-31 01:14:07

我同意威克托·齐奇拉、托比亚斯和赫夫·罗杰罗提供的答案。他们解释说:

  1. 您的getter (connect属性)不返回您期望的原始SqlConnection,因此原始连接不会关闭。
  2. 您应该在需要时创建SqlConnection,只在需要时保持打开,并在完成时关闭它们。

以下是一个完整的解决方案:

代码语言:javascript
复制
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();
  }
}
票数 0
EN

Stack Overflow用户

发布于 2012-01-30 04:06:33

默认情况下,SQL连接是池的。因此,当你需要的时候,你应该“创造”它们,当你需要的时候,你应该摧毁它们。(如果使用using而不是try/finally,代码会更简单。)

票数 1
EN

Stack Overflow用户

发布于 2012-01-29 18:18:24

您在代码中引用了两次connection,因此您有两个不同的连接,因为get之三总是创建一个新的连接!

因此,后者被创建,然后立即被处理,但前者没有关闭。

至少重写您的代码以:

代码语言:javascript
复制
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();
    }
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9055470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档