[JAVA] Informationen zum Trennen () von HttpURLConnection

Einführung

Kürzlich habe ich zu Hause Code wie den folgenden "Sample.java" geschrieben.

Sample.java


HttpURLConnection urlconn = null;
PurchaseItemInfo itemInfo = null;
try {
    URL url = new URL([URL]);
    urlconn = (HttpURLConnection) url.openConnection();
    urlconn.setRequestMethod("GET");
    urlconn.setInstanceFollowRedirects(false);
    urlconn.connect();

    try (InputStreamReader inReader = new InputStreamReader(urlconn.getInputStream());
            BufferedReader reader = new BufferedReader(inReader);) {
        doSomething();
    }
} finally {
    urlconn.disconnect();
}

Während ich dies schrieb, habe ich mich mit HttpURLConnection befasst, aber am Ende habe ich sowohl ein Beispiel gefunden, das Disconnect () aufruft, als auch ein Beispiel, das es nicht aufruft. Wenn Sie eine Ressource (FileInputStream oder Connection) öffnen () und dann versuchen, sie mit Ressourcen automatisch zu schließen, oder sie in der finally-Klausel explizit schließen (), belegt sie normalerweise die Ressource, bis sie zum Ziel von GC wird. Ich dachte, es sei eine Faustregel, immer zu schließen (). Ich dachte, dass es für HttpURLConnection dasselbe ist, aber ich kann Try-with-Resources nicht verwenden, da ich die AutoCloseable-Schnittstelle nicht implementiert habe (* Weil Sie darauf hingewiesen haben, [das Ende dieses Artikels](https: // qiita) .com / taumax / items / 1e3b03771fe73adfaf95 # 20191111-% E3% 81% 94% E6% 8C% 87% E6% 91% 98% E3% 82% 92% E3% 81% 84% E3% 81% 9F% E3% 81% A0% E3% 81% 84% E3% 81% 9F% E3% 81% AE% E3% 81% A7% E4% BF% AE% E6% AD% A3) (Vielleicht) Ist es ein bisschen anders? Ich fing an zu denken, also sah ich nach.

Unterschied zwischenconnect () von HttpURLConnection und close () der Ressource

HttpURLConnection (API-Spezifikation) wie folgt angegeben.

Jede HttpURLConnection-Instanz wird verwendet, wenn eine einzelne Anforderung gestellt wird. Die Netzwerkverbindung zum dahinter liegenden HTTP-Server kann jedoch transparent für andere Instanzen freigegeben werden. Das Aufrufen der Methode close () im InputStream oder OutputStream der HttpURLConnection nach der Anforderung kann die dieser Instanz zugeordneten Netzwerkressourcen freigeben, hat jedoch keine Auswirkungen auf die gemeinsam genutzte dauerhafte Verbindung. .. Wenn Sie die Methode "connect ()" aufrufen und die dauerhafte Verbindung zu diesem Zeitpunkt inaktiv ist, wird der von Ihnen verwendete Socket möglicherweise geschlossen.

Wenn ich mir die Sites angesehen habe, die ich als Referenz geschrieben habe, besteht außerdem die Möglichkeit, dass der Socket geschlossen wird, wenn ich () HttpURLConnection trenne, auch wenn er mit der KeepAlive-Einstellung inaktiv ist. (HttpURLConnection ist das Standard-Keepalive)

Wenn Sie () InputStream / OutputStream schließen, anstatt () HttpURLConnection zu trennen, werden die Netzwerkressourcen freigegeben, aber der Socket wird nicht geschlossen und wiederverwendet. Es scheint, dass. Wenn Sie so etwas wie dieses Mal selbst machen, müssen Sie sich dessen nicht bewusst sein. Wenn Sie jedoch ein System haben, in dem viele Personen aus Gründen wie dem Verbinden wiederholt eine Verbindung herstellen / trennen, sollten Sie sich dessen bewusst sein. Wenn Sie es nicht codieren, kann dies zu dem schlimmsten Leistungsproblem führen ... Ich habe eins gelernt.

Referenz

HttpURLConnection # trennen und am Leben erhalten

2019/11/11 Korrigiert, weil Sie darauf hingewiesen haben

In der "Einführung" dieses Artikels "dachte ich, dass es für HttpURLConnection dasselbe ist, aber ich kann Try-with-Resources nicht verwenden, da ich die AutoCloseable-Schnittstelle nicht implementiert habe." Sie haben auf diesen Teil hingewiesen.

AutoCloseable ist eine funktionale Schnittstelle und kann auch in Lambda-Ausdrücken implementiert werden.

HttpURLConnection urlconn = (HttpURLConnection) url.openConnection(); try (AutoCloseable c = () -> urlconn.disconnect()) { doSomething(); }

Natürlich hat AutoCloseable nur eine close () -Methode, sodass Sie Lambda-Ausdrücke verwenden können. .. .. Sie können also auch schreiben:

Sample.java


URL url = new URL([URL]);
HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setRequestMethod("GET");
urlconn.setInstanceFollowRedirects(false);

PurchaseItemInfo itemInfo = null;
try (AutoCloseable c = () -> urlconn.disconnect();
        InputStreamReader inReader = new InputStreamReader(urlconn.getInputStream());
        BufferedReader reader = new BufferedReader(inReader);) {

    urlconn.connect();
    doSomething();
}

Vielen Dank für den Hinweis. Ich habe viel gelernt.

das ist alles.

Recommended Posts

Informationen zum Trennen () von HttpURLConnection
Über die Auswahl von OpenJDK
Über DI des Frühlings ①
Über DI des Frühlings ②
Informationen zum Formular. ○○ von form_with
Über den Umgang mit Null
Über Java-Instanzen
Über die einfache Bedienung von Docker
Informationen zur Beschreibung von Docker-compose.yml
Über Größenvergleich von compareTo
Informationen zu Arten der Codeabdeckung
Memorandum über LOD.
Über teilweise Übereinstimmung des Selektors
Über die Grundlagen der Android-Entwicklung
Über Biocontainer fastqc und Java
Über Lambda, Stream, LocalDate von Java8
Informationen zur Fehlerbehandlung der Kommentarfunktion
[Rails] Über die Implementierung der Like-Funktion
Über das Binden der Spring AOP Annotation
Informationen zur Rolle der Initialisierungsmethode
Informationen zu removeAll und RetainAll von ArrayList
Denken Sie an die 7 Regeln von Optional
Über =
Über das Hochladen von Bildern von jsp (Servlet)
Informationen zum Festplatten-Cache der Glide 4-Serie
Erklärt Ruby Array-Objekte
Informationen zur Protokollebene von java.util.logging.Logger
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
[Rails 6.0] Informationen zum Batch-Speichern mehrerer Datensätze
Informationen zur Funktionsweise von next () und nextLine ()
Informationen zur ersten Anzeige von Spring Framework
[Java-Anfänger] Informationen zur Initialisierung eines mehrdimensionalen Arrays
[Grundkenntnisse in Java] Informationen zur Typkonvertierung
Über die Behandlung von BigDecimal (mit Reflexion)
Über die Anzahl der Threads von Completable Future