我有一个带有SQL Server 2008数据库的ASP.Net 4.0网站。我希望在保持站点运行的同时,同时为网站和数据库部署依赖更改。我的正常程序是首先部署网站更改,并在网站编译时,部署数据库更改。如果我足够快以在第一个请求完成编译之前更改数据库,则此方法有效。
我不希望网站上有任何停机时间。
编辑:我无法购买任何新硬件或软件。
有更好的方法吗?
编辑:注意:我的网站不使用会话状态等持久性信息,因此重新编译应用程序不会对我造成任何问题。
答案 0 :(得分:3)
当您发布对应用程序的更改时,实际上没有良好的方法来阻止IIS重新启动。这在理论上是可能的,但所需的改变会超过这样做的好处。
我认为您应该将停机时间保持在最低限度,而不是完全消除停机时间。没有人喜欢停机时间,但在很多情况下它都是必要的恶魔。
对于数据库更改,有一些工具可以使更新数据库的过程更加容易。我建议看看Red Gate的SQL Compare和SQL Data Compare。这些工具允许您比较模式和数据,并在几秒钟内同步数据库。我已经使用这两种工具了好几年了,而且它们确实是节省时间的。
SQL比较:
http://www.red-gate.com/products/sql-development/sql-compare/
SQL数据比较:
http://www.red-gate.com/products/sql-development/sql-data-compare/
答案 1 :(得分:1)
您必须使数据库更改向后兼容,首先部署它们。然后你可以继续做你正在做的时间问题。
答案 2 :(得分:1)
我喜欢@rick schott关于使db更改向后兼容的想法。但是,我认为你最终需要某种集群/农场/花园。如果您有群集Web服务器和群集数据库服务器,则可以从池中取出一个Web和一个db,部署到那些,在那里测试应用程序。然后将它们放回池中,取出其他的,更新它们并将它们放回去。
答案 3 :(得分:1)
您的代码与数据库的耦合程度如何?在某些地方看起来像这样:
dt.Rows[0]["CustomerId"];
ORM非常适合缓解数据库更改。但是,这对您来说可能不是一个可行的选择。相反,在主要数据库更改之外,我会尝试编写适用于现有架构和新架构的代码。例如,使代码减少依赖于现有(或不存在)的列...如果不存在int,则默认为零....如果varchar不存在,则为默认空字符串。
“计算机科学中的所有问题都可以通过另一层次的间接解决。”巴特勒兰普森
答案 4 :(得分:1)
如果要进行存储过程更改,也许可以在添加新参数时默认参数?这是让你在网站发布之前移动数据库代码。
当前生产存储过程的示例...
ALTER PROCEDURE [dbo].[p_Stored_Proc_Name]
@Some_Id INT
AS
向存储过程添加新参数...
ALTER PROCEDURE [dbo].[p_Stored_Proc_Name]
@Some_Id INT,
@New_Parameter = 0
AS
您需要确保存储的proc代码按照您希望的方式处理@New_Parameter = 0。
答案 5 :(得分:-2)