从ASMX调用静态方法的缺陷

时间:2009-08-23 18:22:24

标签: c# asp.net .net static asmx

我想知道从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次调用)?

3 个答案:

答案 0 :(得分:3)

需要注意的是静态成员更改应用程序域中其他线程可访问的状态。在这些情况下,你必须采取适当的措施,使其有序地发生。

你的方法不会触及任何状态(一切都是本地的)所以你没事。


正如duffymo和nader所说,你应该处理你的连接,因为你应该使用任何实现IDisposable的对象。

答案 1 :(得分:3)

我不知道C#是否像Java一样,但是在离开方法之前打开SQL连接并且没有关闭它对我来说似乎不是一个好主意。 GC一旦超出范围就会清理它,但这与在Java中关闭连接不同。

Java中的习惯用法要求你在finally块中关闭连接。除非你确定C#类不需要这样的东西,否则我会调查它。

你很快就会发现 - 如果它们很少,数以千计的网络电话会迅速耗尽可用的连接数量。

还有一件事需要检查:以这种方式打开连接在Java中很昂贵,所以它们通常是合并的。连接池是否也在C#中完成?保持打开和关闭数据库连接是否效率低下?你能用静态的共享连接完成同样的事情吗?如果你这样做,也许线程问题会发挥作用。

答案 2 :(得分:3)

由于您正在创建新的SqlConnection,因此您希望将其置弃,否则连接将无法关闭。有关使用指南,请参阅MSDN

事实上,它是一个静态方法,但由于你没有更新任何共享状态(全局变量),所以它似乎不是问题。

编辑:AFAIK,webservices中静态方法的“缺陷”与任何其他应用程序中的相同。唯一需要注意的是web服务是一种预计可以长期可靠运行的服务器。因此,随着时间的推移可能导致问题的事情(内存泄漏,数据库连接耗尽等)比运行时间短得多的其他应用程序更重要。