В Java лучше сохранять данные в результирующем наборе или преобразовывать в массив?

#java #arrays #resultset

#java #массивы #результирующий набор

Вопрос:

У меня есть два класса, сервер и несколько клиентов. Серверный класс выполняет запрос к базе данных и извлекает определенное количество строк. Клиенты запрашивают часть этих строк, каждая из которых представляет собой отдельную часть.

В серверном классе лучше сохранять результат запроса в результирующем наборе и преобразовывать в массив объектов, когда клиентский класс выполняет запрос, или преобразовывать все в массив объектов и отправлять его частично, когда возникает запрос?

Я думаю, что поддерживать в результирующем наборе проще в выполнении и контроле.

Ответ №1:

Самая большая причина не оставлять их в результирующем наборе заключается в том, что это не освобождает соединение обратно с пулом (если я не сильно ошибаюсь). Таким образом, вы в конечном итоге удерживаете ресурсы, которые должны быть освобождены для других операций.

Комментарии:

1. Это правда, результирующий набор сохраняет соединение с БД открытым, поэтому в общем случае вы хотите быстро обработать свои результирующие данные и закрыть их, чтобы освободить соединение.

2. Но закрытие результирующего набора не закрывает соединение с базой данных, не так ли? Конечно, соединение будет оставаться открытым до тех пор, пока не будет вызвано connection.close (0. (По общему признанию, это также приведет к удалению результирующего набора)

3. Это явно не закрывает соединение с базой данных. Вы правы в том, что при вызове Connection.close() результирующий набор становится непригодным для использования.

Ответ №2:

На самом деле я не уверен, понял ли я ваш подход. В типичных сценариях клиент / сервер со уровнями сохраняемости клиент (1) вызывает удаленный метод, это (2) запускает операцию с базой данных, и служба (3) отвечает запрошенными объектами.

В вашем сценарии это выглядит так, как будто сервер считывает данные из базы данных, кэширует их и ожидает, когда клиенты запросят фрагменты.

Если я все понял правильно, и сервер кэширует объекты базы данных, тогда он должен преобразовать данные из результирующего набора в объекты, я бы предпочел коллекцию или карту для хранения «строк». Результирующий набор представляет собой довольно хрупкую структуру данных — например, некоторые результирующие наборы не поддерживают повторное чтение записей набора (= вы не можете выполнить итерацию дважды). Я бы всегда брал данные из набора и закрывал их как можно скорее.

Ответ №3:

Если вы намерены передать содержимое результирующего набора другим классам или методам, то определенно лучше извлечь данные из результирующего набора и сохранить их в какой-либо форме структуры данных (массив / список и т.д.). Если вы этого не сделаете, вы начнете добавлять зависимости от пакета java.sql к классам, которые на самом деле не должны быть задействованы в доступе к базе данных. Это также значительно усложняет модульное тестирование этих классов / методов.

Если результирующий набор используется только в очень ограниченной области (т. Е. Одним методом), то нет никакой реальной выгоды в выгрузке его в другую структуру данных.