#java #arrays #resultset
#java #массивы #результирующий набор
Вопрос:
У меня есть два класса, сервер и несколько клиентов. Серверный класс выполняет запрос к базе данных и извлекает определенное количество строк. Клиенты запрашивают часть этих строк, каждая из которых представляет собой отдельную часть.
В серверном классе лучше сохранять результат запроса в результирующем наборе и преобразовывать в массив объектов, когда клиентский класс выполняет запрос, или преобразовывать все в массив объектов и отправлять его частично, когда возникает запрос?
Я думаю, что поддерживать в результирующем наборе проще в выполнении и контроле.
Ответ №1:
Самая большая причина не оставлять их в результирующем наборе заключается в том, что это не освобождает соединение обратно с пулом (если я не сильно ошибаюсь). Таким образом, вы в конечном итоге удерживаете ресурсы, которые должны быть освобождены для других операций.
Комментарии:
1. Это правда, результирующий набор сохраняет соединение с БД открытым, поэтому в общем случае вы хотите быстро обработать свои результирующие данные и закрыть их, чтобы освободить соединение.
2. Но закрытие результирующего набора не закрывает соединение с базой данных, не так ли? Конечно, соединение будет оставаться открытым до тех пор, пока не будет вызвано connection.close (0. (По общему признанию, это также приведет к удалению результирующего набора)
3. Это явно не закрывает соединение с базой данных. Вы правы в том, что при вызове Connection.close() результирующий набор становится непригодным для использования.
Ответ №2:
На самом деле я не уверен, понял ли я ваш подход. В типичных сценариях клиент / сервер со уровнями сохраняемости клиент (1) вызывает удаленный метод, это (2) запускает операцию с базой данных, и служба (3) отвечает запрошенными объектами.
В вашем сценарии это выглядит так, как будто сервер считывает данные из базы данных, кэширует их и ожидает, когда клиенты запросят фрагменты.
Если я все понял правильно, и сервер кэширует объекты базы данных, тогда он должен преобразовать данные из результирующего набора в объекты, я бы предпочел коллекцию или карту для хранения «строк». Результирующий набор представляет собой довольно хрупкую структуру данных — например, некоторые результирующие наборы не поддерживают повторное чтение записей набора (= вы не можете выполнить итерацию дважды). Я бы всегда брал данные из набора и закрывал их как можно скорее.
Ответ №3:
Если вы намерены передать содержимое результирующего набора другим классам или методам, то определенно лучше извлечь данные из результирующего набора и сохранить их в какой-либо форме структуры данных (массив / список и т.д.). Если вы этого не сделаете, вы начнете добавлять зависимости от пакета java.sql к классам, которые на самом деле не должны быть задействованы в доступе к базе данных. Это также значительно усложняет модульное тестирование этих классов / методов.
Если результирующий набор используется только в очень ограниченной области (т. Е. Одним методом), то нет никакой реальной выгоды в выгрузке его в другую структуру данных.