【发布时间】:2015-02-25 10:53:46
【问题描述】:
我需要将 WCF 网络服务连接到 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 实例等等。 感谢您的帮助!
【问题讨论】:
-
你可以创建一个静态:见下面的答案
-
每次都连接有什么问题?池化处理开销。
-
我认为理想情况下,只要服务处于活动状态,数据库连接就应该保持打开状态,因为如果 x 个客户端同时连接到 Web 服务,则会创建 x 个数据库连接。我对吗?什么是池化? @DavidP 我想这样做我只是想确保这种方法是正确的!
-
是的,如果 10 个客户端同时连接到服务,您最终可能会获得 10 个数据库连接——这通常是您想要的,因为您想同时为 10 个客户端提供服务时间。您可以配置 WCF 以将客户端的最大数量限制为您的服务器可以处理的数量——典型的 SQL 服务器可以毫无问题地处理数百到数千个连接;这取决于这些连接在做什么。简单的插入没有问题。如果客户端一一连接,您最终将只有一个与数据库的物理连接(
SqlConnection只是一个包装器)。 -
实际上,您可能正在为每个客户端会话创建一个全新的服务实例(WCF 服务的默认实例化模式)。我唯一能看出您发布的代码 sn-p 有问题的是
SqlCommand和SqlConnection缺少using语句。
标签: c# sql-server wcf