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

我创建了以下三种方法,但对 shutDownDB() 真正在做什么感到困惑。以下是我的问题:

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

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

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

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

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

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

我正在尝试调试我的 Java 代码的一些问题,该代码建立了 http/https 连接。我想知道为什么在调试时连接会变得非常慢(下载一个小网页超过一分钟),即使是在跨过网络工作的方法时也是如此。如果有一些补救措施。


下面我发布了一个示例(您可以更改https:为http:,并尝试从 Eclipse 按下调试它F11- 对于单步执行,在第一个main()语句中放置一个断点,并F6在它在那里暂停时按下。


我的结果(以毫秒为单位的时间):


                        conn time   total time

http  (not stepping)        60           350

http  (stepping over)     1100          1500

https (not stepping)       570          1300

https (stepping over)    21000         83000

编辑:停用后,Show method result after a step operation选项(通过howlger的回答恰如其分地提出补救措施),时代变多更加合理(约十分之一用于HTTPS)。


http  (stepping over 2)     150           450

https (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=======================");

        } 

    }


HUX布斯
浏览 200回答 1
1回答

互换的青春

让我们从Derby 文档中的内容开始:关闭 Derby 或单个数据库嵌入式环境中的应用程序通过在连接 URL 中指定 shutdown=true 属性来关闭 Derby 系统。要关闭系统,您无需指定数据库名称,通常也无需指定任何其他属性。jdbc:derby:;shutdown=true成功关闭总是会导致 SQLException 指示 Derby 已关闭并且没有其他异常。如果您在系统级别启用了用户身份验证,则需要指定凭据(即用户名和密码)才能关闭 Derby 系统,并且还必须在系统级别定义提供的用户名和密码。等等。你的问题:1) 为什么我需要一个活动连接来关闭特定数据库?因为文档是这样说的。因为这就是他们实施它的方式。因为关闭数据库(通常)需要用户认证,而连接建立是用户认证发生的地方。2)关闭连接然后关闭数据库不是更有意义吗?鉴于最后一个,没有。3)如果特定数据库关闭,为什么我需要关闭连接?如果您的应用程序能够应对潜在的资源泄漏,您就不需要这样做;例如,可能尚未在客户端关闭的套接字。但是,如果您的应用程序要在关闭数据库后继续运行,这当然是可取的。4)为什么在特定数据库关闭后我能够重新建立连接?大概是因为它旨在允许这样做。5)关闭特定数据库和关闭连接之间的实际区别是什么?(我对此并不完全确定......)关闭数据库将使特定数据库的所有连接无效。它不会在客户端关闭它们,因此套接字可能会保持打开状态......直到使用相应集合的应用程序部分尝试使用它们,发现它们“死”并关闭它们。相比之下,关闭连接即将关闭该连接,无论是在服务器和客户端。任何套接字都应立即关闭。注意:在嵌入式模式下使用 derby该文档没有区分嵌入式和非嵌入式模式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java