WCF数据库连接:只有一个数据库连接

时间:2015-02-24 19:19:55

标签: c# sql-server wcf

我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,不需要使用LINQ或实体框架。

我尝试按照本教程: http://www.c-sharpcorner.com/UploadFile/rohatash/inserting-data-into-database-using-wcf-service/。 SqlConnection类似乎是我需要使用的,但是当我看到这个服务方法时:

public string InsertUserDetails(UserDetails userInfo)
    {
        // ...
        SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Rajesh;User ID=sa;Password=wintellect");
        con.Open();
        SqlCommand cmd = new SqlCommand("insert into RegistrationTable(UserName,Password,Country,Email) values(@UserName,@Password,@Country,@Email)", con);
        cmd.Parameters.AddWithValue("@UserName", userInfo.UserName);
        cmd.Parameters.AddWithValue("@Password", userInfo.Password);
        cmd.Parameters.AddWithValue("@Country", userInfo.Country);
        cmd.Parameters.AddWithValue("@Email", userInfo.Email);
        int result = cmd.ExecuteNonQuery();
        // ...
    }

我很担心,因为很明显,每个请求都会创建一个数据库连接。

以下是我想要的代码结构示例:

public class Service : IService
{       
    public Company GetCompany(int key)
    {
        // Get existing database connection
        // SELECT * from companies where c_key=key
        // Return Company instance
    }
}

我应该使用什么结构来使用SQL访问数据而不是在每个请求上创建数据库连接?我可以将SqlConnection实例设为静态吗?我不明白WCF如何处理这个问题,将创建多少个Service实例等等。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

通常最佳做法是只在需要时保持连接打开。

您可以通过有效管理资源来提高绩效。 ADO.NET数据提供程序对象实现IDisposable,允许您使用using statements来确保正确且可预测地释放这些对象及其非托管资源(如数据库连接)。

只要在Dispose()对象上调用Close()(进而调用SqlConnection),它就会将连接释放回连接池。

现代RDBMS旨在同时处理成千上万的连接。您作为开发人员的一部分是确保只在需要时保持连接打开。因此,打开连接,运行SQL,获取结果,关闭连接。

遵循类似的内容:

using (var conn = new SqlConnection(ConnectionString))
{
     conn.Open();
     using (SqlCommand cmd = conn.CreateCommand())
     {
          cmd.CommandText = "SELECT * FROM SomeTable";
          using (SqlDataReader reader = cmd.ExecuteReader())
          {
               while (reader.Read())
               {
                   // DO SOME WORK
               }
          }
     }
}

答案 1 :(得分:1)

您的连接代码和命令代码应使用using语句,以确保正确清理内容。当您创建初始连接时,池将启动。当连接处置它时,它将被释放到池中以便再次使用。您可以使用连接字符串控制池的大小。

答案 2 :(得分:0)

请确保每次都打开和关闭它。

public class Service : IService
{       
    private static SQLConnection con;
    public Company GetCompany(int key)
    {
        // Get existing database connection
        // SELECT * from companies where c_key=key
        // Return Company instance
    }
}