pgjava连接关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pgjava连接关闭相关的知识,希望对你有一定的参考价值。

参考技术A 我注意到我最近无法访问我的 PostgreSQL。我允许的所有 20 个连接都用完了。我不明白为什么,因为我什么都没有打开。似乎即使在 PC 关闭或其他情况下,事情仍然保持打开状态。我正在使用本地工作的远程真实数据库,并且当我使用相同的数据库实时推送它时。

这是一个示例方法,我想知道使用后是否需要关闭

@RequestMapping("/users")
public String users(Model model)
try
Connection connection = getConnection();
Statement stmt = connection.createStatement();
String sql;
sql = "SELECT id, first, last, email, company, city FROM cuser";
ResultSet rs = stmt.executeQuery(sql);
StringBuffer sb = new StringBuffer();
List users = new ArrayList<>();
while (rs.next())
int id = rs.getInt("id");
String first = rs.getString("first");
String last = rs.getString("last");
String email = rs.getString("email");
String company = rs.getString("company");
String city = rs.getString("city");
users.add(new User(id,first, last, email, company, city));

model.addAttribute("users", users);
return "user";
catch(Exception e) return e.toString();


我应该如何在此方法结束时关闭连接

非常感谢任何有时间回答的人
最佳答案

好的,这里有几个问题。

首先是数据库连接最终确实需要超时。有时,由于某些报告需要永远或类似的问题,超时会延长到一些荒谬的事情

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

【中文标题】关闭或不关闭数据库中的连接【英文标题】: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,还是会损失一些性能。

【讨论】:

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

在关闭连接之前关闭阅读器

dapper 需要关闭数据库连接吗

如何关闭一个TCP连接

Python数据库连接以及游标关闭问题

httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭

SQL怎么关闭数据库连接(删除数据库时需要关闭连接)