【问题标题】:MS SQL -- Okay for multiple users to connect/read/write to database from a web service (c#)?MS SQL - 多个用户可以从 Web 服务 (c#) 连接/读取/写入数据库吗?
【发布时间】:2010-07-28 16:47:39
【问题描述】:

这可能是一个简单的...

现在我有一个可用的 Web 服务(用 C# 编程),它提供了两个 Web 方法,可以读取或写入数据到 MS SQL 数据库。我想知道的是……当多个用户尝试连接、读取和写入数据库时​​,我是否需要担心错误?此外,当他们访问数据库时,我是否应该在我的 web 方法中使用线程和锁(现在,我没有使用线程或锁)?

这是我现在运行的一些想法(代码 sn-p):

[WebMethod(Description = "Attempts to post a new score to the scoreboard.")]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public TextMessage UpdateScoreboard(string password, string playerName, 
          int level, int gameBoard, string auth)
    {
        SqlDataReader myReader = null;
        SqlCommand myCommand = null;
        SqlConnection myConnection = null;

        /*
        The method then attempts to connect to the DB, 
        look for a duplicate playerName, and if there isn't one,
        data is entered into the DB ... using the INSERT command.
        */
    }

谢谢。

【问题讨论】:

    标签: c# .net sql-server web-services


    【解决方案1】:

    根据具体情况,您不必担心太多。与数据库的性质一样,您可能会遇到这样的情况,即从数据库中读取数据的人正在获取“旧”信息,因为他们可能无法获得最近从读取操作发生时输入的信息。如果这对您的特定情况来说是一个大问题,那么您将不得不考虑使用锁,但是如果这不是什么大问题,您应该没问题。

    但是,如果您开始收到大量的写入或读取请求,您可能不得不担心锁定或并发问题。不过,基于简单性,听起来您不必担心太多。

    无论如何,请确保您处理异常并为可能发生的明显事情做好计划(与 SQL 的连接已关闭、代码中可能出现的各种错误情况等)

    我通常建议不要使用锁定和线程,除非您绝对有充分的理由走这些路。由于 Web 服务的性质,线程在这里也应该不是什么问题,它们旨在处理并发使用。也就是说,除非您有一个运行时间很长的服务请求,否则我会将其移至线程中,但是,复杂性越低越好。

    【讨论】:

    • 感谢您的回复。我不担心用户获得“旧”数据......如果需要,他们可以刷新他们的界面。我只是担心错误。也就是说,所有相关的读/写请求都已经被 try/catch 语法包围了。所以,如果我正确理解你的回答,我唯一需要担心的是当负载很重并且有人的请求可能由于内置锁定等而被阻止时?如果是这样,那很好。错误消息将传递给用户,他/她可以重新提交。顺便说一句,这些命令无论如何都是简单的 INSERT/UPDATE 命令。谢谢。
    • 如果您的负载过重,您的服务可能会停止接受请求,您可以为 Web 服务配置大量设置来处理请求和负载大小以及安全问题。我建议在处理错误和返回错误消息时,考虑安全性,是否可以向用户提供原始错误消息,或者向他们发送通用消息以隐藏代码细节是否更明智?标准的安全实践就是我想说的。
    • 好的。谢谢您的帮助。现在负载非常低(一次不超过 5 个用户),但我试图提前计划。另外,感谢您提供有关安全性的建议。现在我返回的只是一个通用错误消息(不管实际的错误类型如何),所以我想我已经设置好了。最后,您提到了为处理请求和有效负载大小而更改的设置...您能否将我指向一个包含该信息的好网站,或者也许可以帮助我为 Google 提供一个体面的搜索字符串?我对网络服务有点陌生。谢谢。
    • 我也不是 Web 服务方面的专家,但是如果您使用 WCF,您可能会参考,但我认为您不使用 WCF,因为您使用的是 WebMethods,因此您对这些类型的控制权将更少事物。你可能对你所做的事情没问题,这是一个严肃的项目还是只是业余爱好者/学习?无论哪种方式,我都建议您查看 WCF 服务,因为它们具有更多功能,您可以根据需要进行配置。不过,这可能有点矫枉过正,至少要考虑一下。 msdn.microsoft.com/en-us/library/ms733932.aspx
    • 目前,我没有使用 WCF,但是您链接到的网站是一个很好的阅读,如果我将来需要,我肯定会使用它。现在,这只是我发布的一款 Android 游戏的简单记分牌 Web 服务。数据传输和用户数量很少,但我想我会问这个问题,以防万一它变得流行,或者我决定在更大的项目中实现相同的基本功能。再次感谢。
    【解决方案2】:

    是的,你必须担心它。 (但不是在您的网络服务中使用线程和锁 - 这可能无济于事)。

    如果您通过 SqlCommand 使用存储过程(锁定提示、尝试/捕获异常处理),我认为您可以处理一定数量。您仍然可能会遇到错误,因此您还必须在 Web 服务本身中处理它们。

    【讨论】:

    • 您好,感谢您的回复。您能否更具体地说明您所指的“锁定提示、尝试/捕获异常处理”的类型?谢谢。
    • 您需要了解锁定 - 无论附加的客户端如何,这都会发生在数据库级别:msdn.microsoft.com/en-us/library/aa213039(SQL.80).aspx TRY/CATCH 是 T-SQL 中支持的错误处理技术:msdn.microsoft.com/en-us/library/ms175976.aspx
    • 感谢您的回复。我在数据库方面的大部分经验都是使用 SQLite,所以我理解考虑锁定因素的必要性,但我希望 MS SQL 更复杂一些,并且自动处理所有这些(特别是考虑到它是一种面向 Web 的技术)。您发布的内容很有帮助。我没有考虑在 SQL 本身中使用 try/catch 块。目前,我只在 c# 代码中使用它们。谢谢你,我会考虑这一切。
    • @borg17of20 SQL Server 会自行处理锁定。您可以在默认锁定行为下运行而不会遇到问题。 SQL Server 绝不允许数据库处于不一致状态。任何 RDBMS 都可能发生的情况是,当一个进程等待获取锁时,您可能会陷入死锁情况或临时阻塞情况。但它是一个多用户数据库。如果您有成百上千的用户访问数据库并且您希望保持快速的性能,您必须了解如何减少事务的占用空间以避免锁升级。
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多