我想知道从ASP.NET web服务调用静态方法是否存在陷阱。
internal static object SelectScalar(String commandText, DataBaseEnum dataBase)
{
SqlConnection sqlc = new SqlConnection(AuthDbConnection.GetDatabaseConnectionString());
object returnval=null;
if (sqlc!=null)
{
SqlCommand sqlcmd = sqlc.CreateCommand();
sqlcmd.CommandText = commandText;
sqlc.Open();
returnval = sqlcmd.ExecuteScalar();
}
return returnval;
}那么,以上面的方法为例;多个web方法和多个客户端同时调用此方法是否存在缺陷(例如,对调用此函数的web方法的1000次调用)?
发布于 2009-08-23 18:35:55
因为您正在创建一个新的SqlConnection,所以您想要处理它,否则连接将不会关闭。有关使用指南,请参阅MSDN。
事实上,它是一个静态的方法。这似乎不是问题,因为您没有更新任何共享状态(全局变量)。
编辑: AFAIK,webservices中静态方法的“陷阱”与任何其他应用程序中的一样。唯一需要注意的是,for服务是一种期望长时间可靠运行的服务器。因此,随着时间的推移可能导致问题的事情(内存泄漏、数据库连接耗尽等)比运行时间短得多的其他应用程序更重要。
发布于 2009-08-23 18:28:28
需要注意的是,当静态成员更改可由应用程序域中的其他线程访问的状态时。在这些情况下,你必须采取适当的措施,使其以有序的方式发生。
你的方法本身不会触及任何状态(所有东西都是本地的),所以你没问题。
正如duffymo和nader所指出的,您应该像处理任何实现IDisposable的对象一样处理您的连接。
发布于 2009-08-23 18:35:48
我不知道C#是不是像Java一样,但是打开一个SQL连接并在离开方法之前没有关闭它对我来说似乎不是一个好主意。一旦它超出作用域,GC就会将其清除,但这与在Java中关闭连接不是一回事。
Java中的习惯用法要求您在finally块中关闭连接。除非您确定C#类不需要这样的东西,否则我会研究一下。
你很快就会发现-数以千计的web调用会很快耗尽可用的连接数量,如果它们很少的话。
还有一件事需要检查:在Java中,以这种方式打开连接的代价很高,因此它们通常是池化的。连接池也是在C#中实现的吗?保持打开和关闭数据库连接的效率是否很低?你能用一个静态的共享连接来完成同样的事情吗?如果你这样做,也许线程问题就开始起作用了。
https://stackoverflow.com/questions/1319192
复制相似问题