如何正确更新服务器上的db文件?

问题描述 投票:0回答:1

我有一个Web应用程序asp.net来查看数据库。从另一个应用程序,数据库文件会上传到服务器,但如果您停止站点并再次启动,Web 应用程序中的表就会更新。重新加载页面没有帮助。

"ConnectionStrings": {
  "DefaultConnection": "Data Source=./File/computerservice.db"
}

    public IActionResult Index()
    {
        System.IO.File.Copy("computerservice.db", "./File/computerservice.db", true);
        var list = _context.Orders.Where(i => i.InProgress && !i.Deleted).Select(a => new 
        {
            a.Id,
            a.DateCreation,
            a.NameMaster,
            a.Device,
            a.NameClient
        }).OrderByDescending(i => i.Id).ToList();
        return View(list);
    }

我将db文件上传到服务器的应用程序:

        FtpClient client = new()
        {
            Host = host,
            Credentials = new NetworkCredential(name, password)
        };
        client.Connect();

        try
        {
            client.UploadFile("./Service/computerservice.db", "www.webapp.com/computerservice.db");

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
asp.net ftp
1个回答
0
投票

数据库文件锁定:在您的场景中,Web 应用程序可能会保留与数据库文件的打开连接,这可能会阻止更新可见。 SQLite 似乎是您正在使用的数据库(给定 .db 文件扩展名),它不能很好地处理并发访问,尤其是在 Web 环境中。

缓存:ASP.NET 和实体框架(如果您正在使用它)可以主动缓存数据。如果连接未正确刷新或上下文未正确处理,它可以继续从缓存提供数据,忽略磁盘上的更改。

以下是处理此问题的一些策略:

  1. 确保正确关闭连接

确保每次操作后正确关闭数据库连接。这对于 SQLite 等基于文件的数据库至关重要。

在实体框架中,这可以通过正确处理上下文或在 using 语句中使用它来控制。但是,从您的代码片段来看,尚不清楚您的 _context 是如何管理的。确保 _context 在使用后被处置,或者如果问题仍然存在,请考虑为每个操作创建一个新的上下文实例:

public IActionResult Index()
{
    System.IO.File.Copy("computerservice.db", "./File/computerservice.db", true);
    using (var context = new YourDbContext())
    {
        var list = context.Orders.Where(i => i.InProgress && !i.Deleted).Select(a => new 
        {
            a.Id,
            a.DateCreation,
            a.NameMaster,
            a.Device,
            a.NameClient
        }).OrderByDescending(i => i.Id).ToList();
        return View(list);
    }
}
  1. 刷新数据库连接

通过重置连接池(如果适用)或为每个请求创建 DbContext 的新实例来强制刷新数据库连接,如上所述。

  1. 对 DbContext 使用依赖注入

如果您尚未对 DbContext 使用依赖项注入,请考虑在 Startup.cs 中配置它。这可确保您为每个请求获得新鲜的上下文,这在以下场景中会有所帮助:

services.AddDbContext<YourDbContext>(options =>
    options.UseSqlite("Data Source=./File/computerservice.db"));

然后,将 DbContext 注入到您的控制器中:

private readonly YourDbContext _context;

public YourController(YourDbContext context)
{
    _context = context;
}
  1. 验证文件复制操作

在查询数据库之前,请确保文件复制操作已成功完成。有时,文件操作可能会延迟或不会立即同步到磁盘。

  1. 监控文件更改

考虑实现一种机制来检测数据库文件何时更新,然后相应地刷新或重置数据库上下文。这可能涉及文件观察器或检查文件更改的自定义逻辑。 其他注意事项

测试不同的环境:如果您在本地测试并在不同的服务器上部署,请确保跨环境的行为一致。 数据库选择:评估 SQLite 是否适合您的用例,特别是如果您期望高并发性或需要更强大的连接处理。

© www.soinside.com 2019 - 2024. All rights reserved.