关闭或不关闭数据库中的连接

Posted

技术标签:

【中文标题】关闭或不关闭数据库中的连接【英文标题】:To close or not to close connection in database 【发布时间】:2011-06-25 02:58:35 【问题描述】:

我使用SqlCEWindows-Mobile and Windows-CE 合作,但我不知道该怎么做。

要在程序打开时打开连接,运行任何查询的...更新...删除数据库并在程序关闭后关闭连接?

或者打开连接运行任何查询的..update...删除数据库并立即关闭连接?

【问题讨论】:

【参考方案1】:

很好。答案无处不在。以下是我从经验和与 SQL Compact 团队的互动中了解到的:

    关闭连接会刷新您所做的更改,否则引擎会在执行此操作之前等待刷新周期。使用完成后关闭连接是个好主意,以确保您的更改实际进入存储区。写入后和刷新前断电会丢失数据。 没有官方的连接池,但是打开第一个连接很昂贵(即慢),其他的都很快。我从团队那里得到的建议是在应用程序启动时实际创建一个连接,然后让它保持打开状态。您实际上不需要使用它,但保持打开状态会缓存大量连接信息,以便后续连接到同一个商店时很快。

所以答案实际上是两者兼而有之。

编辑

对于那些感兴趣的人,可以在OpenNETCF ORM library 中看到如何工作的一个很好的例子。默认情况下,该库创建一个保持打开状态的“维护”连接,用于执行模式查询等操作。所有其他数据操作都使用它们自己的连接。您还必须选择将库配置为在 Store 的整个生命周期内重复使用单个连接,或者在每次触及 Store 时使用新连接。在我使用默认值的所有项目中,性能和行为一直是最好的(这就是我将其设为默认值的原因)。

【讨论】:

感谢您的信息。刚开始使用您的 ORM 库。 :-) 我遇到了 MS Charts 连接打开时间慢的问题。按照您的建议,我打开了第一个连接并保持打开状态。然后在这些时间以正确的方式打开/关闭所有其他连接。没有连接保持打开的时间跨度:00:00:00.0477849 图表重绘略有延迟。根据 ctacke 建议,连接保持打开状态的时间跨度:00:00:00.0007839 图表立即重绘。太棒了!【参考方案2】:

在 Windows Mobile 应用的整个生命周期内始终保持连接打开。打开 SQL Server Compact 数据库是一项昂贵的操作。

【讨论】:

【参考方案3】:

您应该在每次完成 sql 事务以释放连接端口时关闭连接。始终是避免安全漏洞的好习惯。

【讨论】:

你能解释一下“安全漏洞”吗? SQL Compact 托管在进程内,因此没有“连接端口”。【参考方案4】:

连接建立是一个缓慢的操作,因此,创建和关闭它会降低应用程序的速度。相反,如果你有很多客户端,连接池会很快被填满,其他客户端将无法连接。

【讨论】:

【参考方案5】:

这里已经有一些相互矛盾的答案。

说实话,我不太确定 WinCE 如何处理连接。我认为没有 ConnectionPool。

但 .NET 中的一般模式是保持连接尽可能短。这提高了可靠性并防止了资源泄漏。确保您了解using (var conn = ...) ... 模式。

所以我会说:选择第二个选项,只有在您确实遇到性能问题并且打开连接是原因时才保持连接更长时间。我不认为它会与 SqlCE 一起使用

【讨论】:

【参考方案6】:

在 wince 等单用户平台上,保持连接打开并没有什么坏处,而且您可能会获得更好的性能。

【讨论】:

【参考方案7】:

如果担心由于您不经常调用Close() 而导致数据丢失,您可以在立即将更改提交到磁盘的事务中执行您的代码:

using (SqlCeTransaction transaction = this.connection.BeginTransaction())

    using (SqlCeCommand command = new SqlCeCommand(query, connection))
    
        command.Transaction = transaction;
        command.ExecuteNonQuery();
    
    transaction.Commit(CommitMode.Immediate);

当然,如果过于频繁地使用CommitMode.Immediate,还是会损失一些性能。

【讨论】:

以上是关于关闭或不关闭数据库中的连接的主要内容,如果未能解决你的问题,请参考以下文章

使用啥orm或不使用它[关闭]

MySQL 视图 - 使用或不使用 [关闭]

SQLite-WinRT 包装器中的关闭连接

当连接未正确关闭时,为啥使用 WAL 模式的 SQLite 数据库中的数据会丢失?

如何自动关闭 PostgreSQL 中的空闲连接?

Wildfly 数据源中的空闲超时后未关闭数据库连接