首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ASMX调用静态方法的陷阱

从ASMX调用静态方法的陷阱
EN

Stack Overflow用户
提问于 2009-08-23 18:22:24
回答 3查看 1.3K关注 0票数 2

我想知道从ASP.NET web服务调用静态方法是否存在陷阱。

代码语言:javascript
复制
    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次调用)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-23 18:35:55

因为您正在创建一个新的SqlConnection,所以您想要处理它,否则连接将不会关闭。有关使用指南,请参阅MSDN

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

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

票数 3
EN

Stack Overflow用户

发布于 2009-08-23 18:28:28

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

你的方法本身不会触及任何状态(所有东西都是本地的),所以你没问题。

正如duffymo和nader所指出的,您应该像处理任何实现IDisposable的对象一样处理您的连接。

票数 3
EN

Stack Overflow用户

发布于 2009-08-23 18:35:48

我不知道C#是不是像Java一样,但是打开一个SQL连接并在离开方法之前没有关闭它对我来说似乎不是一个好主意。一旦它超出作用域,GC就会将其清除,但这与在Java中关闭连接不是一回事。

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1319192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档