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

时间:2011-02-10 20:02:41

标签: c# windows-mobile windows-ce sql-server-ce

我使用Windows-Mobile and Windows-CESqlCE合作,我不知道还有什么可以做的。

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

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

7 个答案:

答案 0 :(得分:13)

尼斯。答案到处都是。以下是我从经验和与SQL Compact团队交互中所了解的内容:

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

    修改

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

每次完成sql事务以释放连接端口时,都应该关闭连接。始终是避免安全漏洞的良好做法。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

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

所以我会说:选择你的第二个选项,如果你真的遇到性能问题,只保持连接时间更长,如果打开连接就是原因。我认为它不适用于SqlCE

答案 5 :(得分:1)

在像wince这样的单用户平台上,保持连接打开没有任何害处,您可能会获得更好的性能。

答案 6 :(得分:0)

如果因为您没有经常调用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时仍会有一些性能损失。