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.
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.
・ HttpURLConnection # trennen und am Leben erhalten
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