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

WCF database connection: only one database connection

我需要将 WCF 网络服务连接到 SQL 服务器数据库。我只需要使用 SQL 来访问数据,不需要 LINQ 或 Entity Framework.

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

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 如何处理这个问题,将创建多少服务实例等。 感谢您的帮助!

只需确保每次打开和关闭它即可。

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
    }
}

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

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

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

现代 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
               }
          }
     }
}

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