Управление соединениями, командами и результирующими наборами Java

Управление соединениями, командами и результирующими наборами JavaКаждый объект Connection может создать один или несколько объектов Statement. Один и тот же объект Statement можно использовать для нескольких несвязанных между собой команд и запросов. Однако для такого объекта допускается наличие не более одного открытого результирующего набора.

Если требуется выполнить несколько команд с одновременным анализом предоставленных ими результатов, вам понадобится несколько объектов Statement.

Не следует, однако, забывать, что, по крайней мере одна широко используемая база данных(Microsoft SQL Server) взаимодействует с JDBC-драйвером, который допускает работу только с одним объектом Statement. Количество объектов Statement, одновременно поддерживаемых JDBC-драйвером, можно узнать, вызвав метод getMaxStatements() класса DatabaseMetaData.Подробное ограничение кажется излишним, но на практике оно почти никогда не влияет на качество работы, так как необходимость одновременно использовать несколько результирующих наборов возникает крайне редко. Если же результаты связанны друг с другом, вы всегда можете составить сложный запрос и анализировать один набор.

Гораздо выгоднее предоставить базе данных возможность самостоятельно соединить результаты, чем перебирать различные наборы в Java-программе.

Закончив работу с классом ResultSet, Statement или Connection, следует как можно скорее вызвать метод close(). Дело в том, что перечисленные объекты используют структуры данных большого объема и вам вряд ли захочется ожидать, пока процедура сборки мусора освободит ресурсы.

Метод close() класса Statement автоматически закрывает связанные с ним результирующие наборы(если, конечно, эти наборы открыты). Аналогично метод close() класса Connection закрывает все объекты Statement для этого соединения.

Если время существования соединения невелико, нет необходимости заботиться о закрытии объектов Statement и результирующих наборов. Нужно лишь поместить вызов метода close() в блок finally, этим вы гарантируете, что объект соединения не останется открытым.