为了账号安全,请及时绑定邮箱和手机立即绑定

关闭特定数据库并关闭连接的正确方法是什么?

关闭特定数据库并关闭连接的正确方法是什么?

HUX布斯 2022-01-12 14:22:39
我创建了以下三种方法,但对 shutDownDB() 真正在做什么感到困惑。以下是我的问题:为什么我需要一个活动连接来关闭特定数据库?关闭连接然后关闭数据库不是更有意义吗如果特定数据库关闭,为什么我需要关闭连接?为什么我能够在特定数据库关闭后重新建立连接?关闭特定数据库和关闭连接之间的实际区别是什么?注意:在嵌入式模式下使用 derby我正在尝试调试我的 Java 代码的一些问题,该代码建立了 http/https 连接。我想知道为什么在调试时连接会变得非常慢(下载一个小网页超过一分钟),即使是在跨过网络工作的方法时也是如此。如果有一些补救措施。下面我发布了一个示例(您可以更改https:为http:,并尝试从 Eclipse 按下调试它F11- 对于单步执行,在第一个main()语句中放置一个断点,并F6在它在那里暂停时按下。我的结果(以毫秒为单位的时间):                        conn time   total timehttp  (not stepping)        60           350http  (stepping over)     1100          1500https (not stepping)       570          1300https (stepping over)    21000         83000编辑:停用后,Show method result after a step operation选项(通过howlger的回答恰如其分地提出补救措施),时代变多更加合理(约十分之一用于HTTPS)。http  (stepping over 2)     150           450https (stepping over 2)    2000          7000我的场景:Java 8 (1.8.0_121-b13),64 位,Win-7,Eclipse Photon(也体验过 Oxygen)。import java.io.*;import java.net.*;import java.nio.charset.StandardCharsets;public class TestConn {    public static void downloadFromUrl(final URL url) throws IOException {        long t0 = System.currentTimeMillis();        URLConnection conn = url.openConnection();        System.out.println("conn msecs: " +              (System.currentTimeMillis() - t0) + " url=" + url);        System.out.println("=====================================");        try (BufferedReader in = new BufferedReader(                new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {            String line;            int cont = 0;            while ((line = in.readLine()) != null) {                if (cont++ < 4)                    System.out.println(line);            }             if(cont >=4)                 System.out.printf("== total lines: %d (%d skipped)\n",cont,cont-4);            System.out.println("==============done=======================");        }     }
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

让我们从Derby 文档中的内容开始:

关闭 Derby 或单个数据库

嵌入式环境中的应用程序通过在连接 URL 中指定 shutdown=true 属性来关闭 Derby 系统。要关闭系统,您无需指定数据库名称,通常也无需指定任何其他属性。

jdbc:derby:;shutdown=true

成功关闭总是会导致 SQLException 指示 Derby 已关闭并且没有其他异常。

如果您在系统级别启用了用户身份验证,则需要指定凭据(即用户名和密码)才能关闭 Derby 系统,并且还必须在系统级别定义提供的用户名和密码。

等等。


你的问题:

1) 为什么我需要一个活动连接来关闭特定数据库?

  • 因为文档是这样说的。

  • 因为这就是他们实施它的方式。

  • 因为关闭数据库(通常)需要用户认证,而连接建立是用户认证发生的地方。

2)关闭连接然后关闭数据库不是更有意义吗?

鉴于最后一个,没有。

3)如果特定数据库关闭,为什么我需要关闭连接?

如果您的应用程序能够应对潜在的资源泄漏,您就不需要这样做;例如,可能尚未在客户端关闭的套接字。

但是,如果您的应用程序要在关闭数据库后继续运行,这当然是可取的。

4)为什么在特定数据库关闭后我能够重新建立连接?

大概是因为它旨在允许这样做。

5)关闭特定数据库和关闭连接之间的实际区别是什么?

(我对此并不完全确定......)

关闭数据库将使特定数据库的所有连接无效。它不会在客户端关闭它们,因此套接字可能会保持打开状态......直到使用相应集合的应用程序部分尝试使用它们,发现它们“死”并关闭它们。

相比之下,关闭连接即将关闭连接,无论是在服务器和客户端。任何套接字都应立即关闭。


注意:在嵌入式模式下使用 derby

该文档没有区分嵌入式和非嵌入式模式。


查看完整回答
反对 回复 2022-01-12
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信