c# - 等待 ASP.NET Core 中的数据库服务器
问题描述
我的 ASP.NET Core Web 应用程序几乎所有功能都使用数据库。如果没有可用的数据库,它就无法生成单个页面。因此,在应用程序启动时数据库可用是很重要的。(我担心以后会中断数据库中断,从现在开始。)由于数据库在单独的主机上运行,它很可能在应该启动 Web 应用程序时关闭。
此外,我确保在应用程序启动时安装了正确的数据库架构。如果数据库架构不是最新的,它可能与安装的应用程序版本不兼容,并且可能会发生崩溃或数据损坏。所以我的应用程序做的第一件事就是查看数据库模式并在需要时对其进行升级。
我现在正在寻找处理数据库停机情况并让应用程序等待数据库的方法。
- 如果我什么都不做,应用程序只会在启动时崩溃,systemd 可能会在放弃之前重新启动它一段时间,从而使应用程序永远不可用。
- 如果我只在启动时检查一次数据库,这将失败。然后我捕获异常并使用简单的错误消息结果缩短应用程序管道。在重新启动之前,该应用程序将不可用,并显示一条简单的消息。这是我目前的情况。
在启动时等待数据库连接是否有任何最佳实践?我想我只是探测连接并等待它成功。这必须阻止该Configure
方法,因为必须在那里完成许多其他初始化工作,但没有数据库就无法完成。但是,如果 Web 应用程序在看到数据库之前应该关闭,那么它也必须可以取消等待并正常关闭应用程序。
这是当前的简化代码:
class Program
{
public static void Main(string[] args)
{
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration(…)
.UseStartup<Startup>()
// ...
.Build()
.Run();
}
}
class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkNpgsql()
.AddDbContext<MainDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("MainDbContext")));
// Other services
services.AddMvc(…);
}
public void Configure(
{
// ...
// Set up database
try
{
// Check and upgrade database schema...
// TODO: Block until database is ready; allow cancellation
}
catch
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("The application could not be " +
"initialized correctly. See the service log for details.");
});
return;
}
// Initialise other services using database data...
// Set up ASP.NET
app.UseStaticFiles();
app.UseMvc(…);
}
}
解决方案
推荐阅读
- javascript - 导入非 es6 库
- php - Wordpress 如何使用仅搜索帖子的第二种形式?
- eclipse - 为什么我的 java Minecraft 插件无法在服务器中注册?
- javascript - 使用 JavaScript 在单击时显示/隐藏 Div
- sql - 查找子查询中不存在的用户/记录
- ios - Xcode项目损坏,由于解析错误无法打开
- node.js - 是否可以将 ejs 文件也用作标准“公共”文件夹中的静态文件?(节点/快递)
- javascript - 在godaddy vhs中实现api
- sql - 希望获得 2 个链接表之间的平均年龄
- angular - 需要创建一个或多个导入循环来编译此组件,当前编译器配置不支持该组件