В спящем режиме кто-то отвечает за закрытие ресурсов, набор результатов, оператор, соединение? - PullRequest
0 голосов
/ 05 июня 2018

почему нам нужно закрыть ресурсы в блоке finally?В hibernate кто несет ответственность за закрытие результирующего набора, оператора, соединения?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

За процессом закрытия выписки отвечает org.hibernate.resource.jdbc.ResourceRegistry.Это реализация org.hibernate.resource.jdbc.internal.ResourceRegistryStandardImpl.Есть метод release, который принимает оператор.Во-первых, все объекты ResultSet закрываются, а затем оператор закрывается окончательно.Ниже приведены некоторые фрагменты этого:

@Override
public void release(Statement statement) {
    :
    :
    final Set<ResultSet> resultSets = xref.get( statement );
    if ( resultSets != null ) {
        closeAll( resultSets );
    }
        xref.remove( statement );
    }
    close( statement );
}

PS:

  1. Информация о зависимостях

    compile 'org.hibernate: hibernate-core: 5.2.2.Final '

0 голосов
/ 05 июня 2018

Во-первых, прочитайте это Почему мне нужно использовать наконец для закрытия ресурсов?

В JDBC есть несколько видов ресурсов, которые в идеале должны быть закрыты после использования.Даже если для каждого Statement и PreparedStatement задано неявное закрытие при закрытии объекта Connection, вы не можете быть уверены, когда (или если) это произойдет, особенно если он используется с пулами соединений.Вы должны явно закрыть ваши объекты Statement и PreparedStatement, чтобы быть уверенными.Объекты ResultSet также могут быть проблемой, но поскольку они гарантированно закрываются при закрытии соответствующего объекта Statement / PreparedStatement, вы обычно можете его игнорировать.

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

Summary : всегда закрывать PreparedStatement / Statement и Connection.До Java 7 было рекомендовано закрывать ресурсы в блоке finally, так как блок finally всегда выполняется независимо от исключения в блоке try. Однако в Java 7+ вы бы использовали идиому try-with-resources, чтобы это произошло автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...