我想知道从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次调用)?
答案 0 :(得分:3)
需要注意的是静态成员更改应用程序域中其他线程可访问的状态。在这些情况下,你必须采取适当的措施,使其有序地发生。
你的方法不会触及任何状态(一切都是本地的)所以你没事。
正如duffymo和nader所说,你应该处理你的连接,因为你应该使用任何实现IDisposable的对象。
答案 1 :(得分:3)
我不知道C#是否像Java一样,但是在离开方法之前打开SQL连接并且没有关闭它对我来说似乎不是一个好主意。 GC一旦超出范围就会清理它,但这与在Java中关闭连接不同。
Java中的习惯用法要求你在finally块中关闭连接。除非你确定C#类不需要这样的东西,否则我会调查它。
你很快就会发现 - 如果它们很少,数以千计的网络电话会迅速耗尽可用的连接数量。
还有一件事需要检查:以这种方式打开连接在Java中很昂贵,所以它们通常是合并的。连接池是否也在C#中完成?保持打开和关闭数据库连接是否效率低下?你能用静态的共享连接完成同样的事情吗?如果你这样做,也许线程问题会发挥作用。
答案 2 :(得分:3)
由于您正在创建新的SqlConnection
,因此您希望将其置弃,否则连接将无法关闭。有关使用指南,请参阅MSDN。
事实上,它是一个静态方法,但由于你没有更新任何共享状态(全局变量),所以它似乎不是问题。
编辑:AFAIK,webservices中静态方法的“缺陷”与任何其他应用程序中的相同。唯一需要注意的是web服务是一种预计可以长期可靠运行的服务器。因此,随着时间的推移可能导致问题的事情(内存泄漏,数据库连接耗尽等)比运行时间短得多的其他应用程序更重要。