Не закрытие URLConnection - PullRequest
       74

Не закрытие URLConnection

0 голосов
/ 24 октября 2018

У меня есть метод ( getRequest ), который открывает URLConnection и возвращает InputStream, здесь я не закрываю URLConnection.

В sendHTTPMessage я закрываюInputStream и ObjectInputStream.

Так это создаст проблему, поскольку я не закрыл URLConnection, согласно моему пониманию, это открывает сокетное соединение с сервером?

    public InputStream getRequest(String url) throws IOException {
        URL url = new URL(url);
        URLConnection con = url.openConnection();
        con.setUseCaches(false);
        this.sendHeaders(con);
        return con.getInputStream();
    }

    private Object sendHTTPMessage(HashMap<String, Object> params) {
        Object resultobj = null;
        InputStream in = null;
        ObjectInputStream ois = null;

        try {

            in = sendGetMessage(params);
            if (in != null) {
                ois = new ObjectInputStream(in);
                serviceResult = (Object)ois.readObject();
            }
        } catch (Exception var14) {
            logger.error("Error during closing :", var14);
        } finally {
            try {
                if (in != null) {
                    in.close();
                }

                if (ois != null) {
                    ois.close();
                }
            } catch (IOException var13) {
                logger.error("Error during closing :", var13);
            }

        }
        return resultobj;
    }

1 Ответ

0 голосов
/ 24 октября 2018

Если вы не закроете InputStream, ваше соединение будет оставаться открытым в течение неопределенного времени, что будет держать открытые ресурсы как на стороне клиента, так и на стороне сервера.Попробуйте этот тест:

        URL url = new URL("https://www.google.com/");
        List l = new ArrayList();
        for(int i = 0; i< 100000; i++) {
            URLConnection con = url.openConnection();
            InputStream in = con.getInputStream();
            in.close();
            l.add(con);
            System.out.println(i);
        }

Запустите его и через некоторое время проверьте открытое соединение на вашем компьютере с помощью команды netstat.Затем остановитесь, удалите in.close (), снова запустите проверку и проверьте netstat.Вы увидите, что во втором тесте соединения остаются открытыми, и их число растет

...