在生产环境中使用LocalDb是否正常?

38

我知道使用 LocalDb 对于开发非常好用和容易,但我想知道在托管网站时,在生产环境中使用它是否是个好主意?

我问这个问题是因为我想知道它在生产环境中是否会有任何速度问题。

这是我想在生产环境中使用的连接字符串:

Server=(LocalDB)\\v11.0;Integrated Security=SSPI;MultipleActiveResultSets=true;
AttachDBFilename=|DataDirectory|ProjectDB.mdf;

3
为什么?为什么?为什么?使用适当的 SQL Server Express 实例,并让所有用户连接到相同的公共数据库实例。在当前模式下,每个连接不是会启动其自己的数据库副本吗?一旦完成后就会被丢弃。更不用说我认为安全上下文在这里不会正常工作,而且您可能会违反最终用户许可协议。另外,您为什么要使用 MultipleActiveResultSets?这是有意为之吗? - Aaron Bertrand
7
不,LocalDB 不适用于生产环境。 - Remus Rusanu
因为我遇到了“已经有一个与此命令相关联的打开的DataReader,必须先关闭它”的错误。 - Stan
@Hossein 这种行为可以被修改。 https://dev59.com/uGYq5IYBdhLWcg3w2EBi - Shenron
4
@RemusRusanu,您能否提供来自Microsoft的数据,说明为什么不能在生产环境中使用LocalDB?这将会很有帮助。 - Murugan
3个回答

48

LocalDB在生产中得到了完全支持。从性能角度来看,它与SQL Server Express相同,因为它们共享同一个数据库引擎。

现在,对于在完整的IIS中运行的网站,我建议使用基于服务的SQL Server Express实例。由于IIS作为服务运行,最好也有一个服务托管的数据库。这意味着您不应该在连接字符串中使用“User Instance=true”或“AttachDbFileName=...”。

如果您想要了解更多信息,我建议阅读关于从完整的IIS使用LocalDB的第1部分其后续的第2部分。它们详细介绍了相关内容。


不确定如何在Server 2012中使其工作,安装asp.net后,文件applicationHost.config没有显示asp.net 4.5添加名称条目。 - Kumar Vikramjeet
这是微软文档的第一句话:“Microsoft SQL Server 2016 Express LocalDB是针对程序开发人员的SQL Server Express执行模式”,https://msdn.microsoft.com/en-us/library/hh510202.aspx 此外,这个Msdn博客有很多有用的内容可供阅读。 http://blogs.msdn.com/b/jerrynixon/archive/2012/02/26/sql-express-v-localdb-v-sql-compact-edition.aspx - Hossein Shahdoost
5
我不认为这是说LocalDB“绝对不支持生产环境”的声明。它的创建是为了让开发人员的生活更加轻松,其中包括嵌入式数据库场景(但不包括进程内)。在IIS中使用它是有些牵强的,这是我在我的答案中指出的。 - Krzysztof Kozielczyk
3
LocalDB是SqlLite的.NET替代品(不需要权限),因此我认为同样的语句适用于LocalDB:https://dev59.com/questions/bXNA5IYBdhLWcg3wjOve,视使用情况而定。你可以在生产环境中使用它,但只考虑用于低流量数据。 - NicoJuicy
2
默认情况下,LocalDB 实例在 5 分钟内无活动后会关闭。当其所有者/创建者再次连接到其中一个数据库时,该实例将自动重新启动。相反,如果连接的用户不是所有者/创建者(在共享实例的情况下),它将不会自动启动。 如果此评论不能帮助您解决问题,请发布一个新问题并包含更多详细信息,并在此处的评论中包含新问题的链接,以便我们收到通知。 - Richard II
显示剩余4条评论

18

"普通" - 很难说,这是一个相对的术语。

允许 - 是的。这里是微软SQL Server Express博客介绍LocalDB时的一句话:

"...如果LocalDB的简单性(和限制)适合目标应用程序环境的需求,开发人员可以继续在生产中使用它,因为LocalDB也是一个非常好的嵌入式数据库。"


更新(2019年3月)

经过在数十个生产站点中使用LocalDB已经两年的时间,我确认它能够工作。然而,如果您需要一个免费的多用户(在LocalDB术语中称为“共享”)DB,请使用SQL Server Express。LocalDB不是一个很好的多用户解决方案。有许多要克服的障碍。我现在没有时间,但如果您想了解更多关于这些障碍以及相关的解决方法的详细信息,请留言,我会在这里或另一个问题中记录它们。


更新(2021年4月)

致命问题 - 在SQL Server LocalDB 2017和2019中,共享(即多用户)实例功能已经无法正常工作了。甚至安装其中一个版本都会阻止访问在早期版本中创建的共享实例。该问题在此处有记录。目前唯一已知的“解决方法”是卸载损坏的LocalDB版本,使用LocalDB 2016或更早的版本。


更新(2021年9月)

现在已经有了解决前一个更新中提到的“停机”问题的修复方法(更新于2021年4月)。我已经成功地测试了这个修复方法,适用于两个版本。 最低版本分别是:


你能简要描述一下你遇到的障碍吗? - gpro
如果您只需要单用户访问,那应该没问题。当您想要DB成为多用户时,问题就出现了,因为托管实例的进程在实例创建者注销时关闭,只能由创建者重新启动。因此,您需要一个“始终开启”的用户作为创建者。如果您可以创建专用服务帐户,请这样做。对我来说这不是一个选项。我选择了“本地系统”,但这会带来其他问题,其中一些在此处有记录:https://stackoverflow.com/a/50491641/1633949。您还需要在最初设置实例安全性时模拟该帐户。 - Richard II
还有其他障碍,如果上面的那些没有让你打消念头,那么请告诉我,我也会记录下其他的障碍。 - Richard II

7

我不这么认为,

虽然LocalDb和SQLExpress在性能上可能相同,但如果LocalDb在一段时间内没有任何请求,它的进程会自行关闭。通常下一个请求需要太长时间才能响应(或者更糟糕的是,超时)。

我建议您安装自己的SQLEXPRESS实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接