Закрытие BufferedReader/PrintWriter закрывают сокетное соединение?

измените row_number() на dense_rank(), чтобы получить желаемые результаты:

select distinct
    _row_ord = 100,
    _client_id =  c.client_id,
    _segment = 'fake',
    --_row = row_number() over(order by c.client_id)
    _value = 
        concat
                (
                'HL*',
                dense_rank() over(order by c.client_id) + 1 ,'*',
                'testfield','~' 
                )

Результаты:

_row_ord    _client_id  _segment    _value
100         1991        fake        HL*2*testfield~
100         1992        fake        HL*3*testfield~

Смотрите живую демонстрацию на rextester.

16
задан palacsint 26 August 2012 в 17:38
поделиться

4 ответа

Да, закрытие любого Устройства записи/Читателя закроет все другие Устройства записи и Средства чтения, которые они переносят. Не закрывайте его, пока Вы не будете готовы закрыть базовый сокет.

16
ответ дан 30 November 2019 в 17:40
поделиться

Как @Eddie сказал (за секунды до меня! :)), закрытие устройства записи и/или средства чтения закроет базовые потоки сокета и сам сокет : Однако, я верю самому сокету, не будет закрыт .

Закрытие возвращенного InputStream закроет связанный сокет.

Вы не должны закрывать устройство записи, ни средство чтения. Просто сбросьте устройство записи, чтобы удостовериться, что Ваши сообщения прибудут вовремя. Закрытие сокета позже закроет соответствующие потоки, таким образом, Вы не должны будете закрывать их сами. Просто оставьте свои объекты читателя/устройства записи GC.

9
ответ дан 30 November 2019 в 17:40
поделиться

Другая альтернатива должна создать себя фильтры NoCloseInputStream и NoCloseOutputStream, которые просто ничего не делают на завершении; затем используйте их для обертывания потоков сокета приложения (перед любым приложением wrappering как буфер).

Примечание, что, если бы необходимо было сделать это, необходимо было бы сохранить ссылку на сокет (или перенесенные потоки) так, чтобы можно было закрыть сокет, когда Вы на самом деле сделаны с ним.

Для ответа на комментарий, что это "слишком совершенствуется понятие для OP": проблема OP состоит в том, что в закрытии высокоуровневого потока, он также закрывает базовый сокет, но это бесполезно, так как он хочет создать дальнейшие потоки верхнего уровня по сокету для отправки дальнейших сообщений. В зависимости от его архитектуры единственный способ достигнуть это может быть должно перенести потоки в обертки NoClose - например, он может передавать потоки сериализатору XML или deserializer, который закрывает поток, когда это сделано, который близко является за пределами его управления.

4
ответ дан 30 November 2019 в 17:40
поделиться

Необходимо закрыть сокет после закрытия потоков.

2
ответ дан 30 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: