【问题标题】:Pitfalls of calling static method from ASMX从 ASMX 调用静态方法的陷阱
【发布时间】:2009-08-23 18:22:23
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    由于您正在创建一个新的SqlConnection,因此您希望将其释放,否则连接不会关闭。有关使用指南,请参阅 MSDN

    虽然它是一个静态方法,但这似乎不是问题,因为您没有更新任何共享状态(全局变量)。

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

    【讨论】:

    • 是的......我应该看看代码的其他方面,除了它是线程安全的。为你 +1。
    • 我刚刚编辑了这个小sn-p。我们确实关闭了连接。
    【解决方案2】:

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

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

    您很快就会发现 - 如果连接数稀少,成千上万的网络调用很快就会耗尽可用连接的数量。

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

    【讨论】:

    • 您正在写关于在连接上调用 dispose 的必要性。为你 +1。
    • @duffymo:是的,池可以使用。见msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx
    • 对不起,我刚刚复制了那个小sn-p并对其进行了编辑。是的 - 我们确实关闭了连接并且我们使用了连接池。我只是想知道是否有任何陷阱-不确定是什么类型的陷阱。我们在很多地方都使用这种范例。
    【解决方案3】:

    需要注意的是静态成员何时更改应用程序域中其他线程可以访问的状态。在这些情况下,您必须采取适当的措施,使其有条不紊地进行。

    您的方法本身不会触及任何状态(一切都是本地的),所以您没问题。


    正如 duffymo 和 nader 所指出的,您应该处置您的连接,因为您应该处置任何实现 IDisposable 的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多