代码之家  ›  专栏  ›  技术社区  ›  choudeshell

从asmx调用静态方法的陷阱

  •  2
  • choudeshell  · 技术社区  · 17 年前

    我想知道从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 回复  |  直到 14 年前
        1
  •  3
  •   Nader Shirazie    17 年前

    因为你在创造一个新的 SqlConnection ,您要释放它,否则连接将无法关闭。见 MSDN 使用指南。

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

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

        2
  •  3
  •   duffymo    17 年前

    我不知道C语言是否像Java,但是打开SQL连接并在离开方法之前关闭它对我来说不是一个好主意。GC将清除它一旦超出范围,但这不是关闭爪哇的连接相同的事情。

    Java中的成语将要求您关闭最后一个块中的连接。除非你确定C班不需要这样的东西,否则我会调查的。

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

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

        3
  •  3
  •   Alfred Myers    17 年前

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

    你的方法不会脱离自身的任何状态(一切都是本地的),所以你没问题。


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

    推荐文章