Парадак у закрыцці рэсурсаў

Ці павінен я зачыніць заяву ў сувязі з гэтым? І ResultSet перад сцвярджэннем? Ці гэта ўсё наадварот?

Connection conn = null;
Statement st = null;
Resultset rs = null;

try {
   //Do stuff

} catch (SQLException e) {
   //Do stuff
}
finally {
    if (rs != null) rs.close();
    if (st != null) st.close();
    if (conn != null) conn.close();         
}

або

Connection conn = null;
Statement st = null;
Resultset rs = null;

try {
   //Do stuff

} catch (SQLException e) {
   //Do stuff
}
finally {
    if (conn != null) conn.close();         
    if (st != null) st.close();
    if (rs != null) rs.close();
}
4
Будзьце асцярожныя: анулюецца блізка() кідае SQLException, кожны блізка() павінна быць у сваім уласным Try/ўлове
дададзена аўтар Aubin, крыніца
Увогуле, вы павінны зачыніць рэсурсы як LIFO - лифо. Такім чынам, першае, што вы адкрываеце (злучэнне) павінна быць апошнім закрытым. Першы спосаб мае сэнс.
дададзена аўтар Gordon Linoff, крыніца
Правіла простае: зачыніць у зваротным парадку адкрыцця. Пасля закрыцця злучэння не будзе ніякага сэнсу ў закрыцці заявы.
дададзена аўтар Marko Topolnik, крыніца
У ідэале сумяшчальны драйвер JDBC, пул злучэнняў і г.д. закрыем ResultSet , Заява і г.д., калі вы зачыняеце Connection ; але, на жаль, рэальнасць такая, гэта не заўсёды адбываецца.
дададзена аўтар Mark Rotteveel, крыніца
@Aubin або абгарнуць блізка ў метадзе. калі ваша праграма спыняе і не закрывае злучэнне з базай дадзеных, гэта не мае вялікага значэння, таму што, калі віртуальная машына памірае, так што робіць гэты рэсурс. Калі ваша праграма павінна працягваць працаваць, гэта праблема, таму што вашы пратачыліся рэсурсы будуць жыць далей.
дададзена аўтар SnakeDoc, крыніца
@Aubin або абгарнуць блізка ў метадзе. калі ваша праграма спыняе і не закрывае злучэнне з базай дадзеных, гэта не мае вялікага значэння, таму што, калі віртуальная машына памірае, так што робіць гэты рэсурс. Калі ваша праграма павінна працягваць працаваць, гэта праблема, таму што вашы пратачыліся рэсурсы будуць жыць далей.
дададзена аўтар SnakeDoc, крыніца
@Aubin або абгарнуць блізка ў метадзе. калі ваша праграма спыняе і не закрывае злучэнне з базай дадзеных, гэта не мае вялікага значэння, таму што, калі віртуальная машына памірае, так што робіць гэты рэсурс. Калі ваша праграма павінна працягваць працаваць, гэта праблема, таму што вашы пратачыліся рэсурсы будуць жыць далей.
дададзена аўтар SnakeDoc, крыніца

12 адказы

Зачыніце набор вынікаў, то зацвярджэнне, то злучэнне.

Іншымі словамі, усё блізка ўніз на лифо аснове.

7
дададзена
@SnakeDoc АКА таксама вядомы як таксама вядомы як.
дададзена аўтар ddmps, крыніца
AKA, таксама вядомы як Stack
дададзена аўтар SnakeDoc, крыніца
@Pescis мне давялося сустрэць мінімальная колькасць асмаленага ;-P
дададзена аўтар SnakeDoc, крыніца
Хоць гэта сапраўды адказвае на пытанне, ён не дапамагае OP стаць лепшым праграмістам і не атрымаць больш ведаў. OP, глядзіце ў A.R.M./Try-С-рэсурсаў Блокі для правільнага спосабу зрабіць гэта ў сучаснай Java (Java 7+). docs.oracle.com/javase/tutorial/essential/exceptions/…
дададзена аўтар SnakeDoc, крыніца

Зачыніце набор вынікаў, то зацвярджэнне, то злучэнне.

Іншымі словамі, усё блізка ўніз на лифо аснове.

7
дададзена
@SnakeDoc АКА таксама вядомы як таксама вядомы як.
дададзена аўтар ddmps, крыніца
AKA, таксама вядомы як Stack
дададзена аўтар SnakeDoc, крыніца
@Pescis мне давялося сустрэць мінімальная колькасць асмаленага ;-P
дададзена аўтар SnakeDoc, крыніца
Хоць гэта сапраўды адказвае на пытанне, ён не дапамагае OP стаць лепшым праграмістам і не атрымаць больш ведаў. OP, глядзіце ў A.R.M./Try-С-рэсурсаў Блокі для правільнага спосабу зрабіць гэта ў сучаснай Java (Java 7+). docs.oracle.com/javase/tutorial/essential/exceptions/…
дададзена аўтар SnakeDoc, крыніца

Зачыніце набор вынікаў, то зацвярджэнне, то злучэнне.

Іншымі словамі, усё блізка ўніз на лифо аснове.

7
дададзена
@SnakeDoc АКА таксама вядомы як таксама вядомы як.
дададзена аўтар ddmps, крыніца
@Pescis мне давялося сустрэць мінімальная колькасць асмаленага ;-P
дададзена аўтар SnakeDoc, крыніца
AKA, таксама вядомы як Stack
дададзена аўтар SnakeDoc, крыніца
Хоць гэта сапраўды адказвае на пытанне, ён не дапамагае OP стаць лепшым праграмістам і не атрымаць больш ведаў. OP, глядзіце ў A.R.M./Try-С-рэсурсаў Блокі для правільнага спосабу зрабіць гэта ў сучаснай Java (Java 7+). docs.oracle.com/javase/tutorial/essential/exceptions/…
дададзена аўтар SnakeDoc, крыніца

Зачыніце набор вынікаў, то зацвярджэнне, то злучэнне.

Іншымі словамі, усё блізка ўніз на лифо аснове.

7
дададзена
@SnakeDoc АКА таксама вядомы як таксама вядомы як.
дададзена аўтар ddmps, крыніца
AKA, таксама вядомы як Stack
дададзена аўтар SnakeDoc, крыніца
@Pescis мне давялося сустрэць мінімальная колькасць асмаленага ;-P
дададзена аўтар SnakeDoc, крыніца
Хоць гэта сапраўды адказвае на пытанне, ён не дапамагае OP стаць лепшым праграмістам і не атрымаць больш ведаў. OP, глядзіце ў A.R.M./Try-С-рэсурсаў Блокі для правільнага спосабу зрабіць гэта ў сучаснай Java (Java 7+). docs.oracle.com/javase/tutorial/essential/exceptions/…
дададзена аўтар SnakeDoc, крыніца

Вы павінны закрыць рэсурсы ў зваротным парадку вы адкрылі (як калі б гэтыя рэсурсы на стэку).

З Java 7 прымеркавай з-рэсурсамі, ідэальны спосаб:

try (
   Connection conn = somethingThatGetsAConnection();
   Statement st = conn.createStatement();
   Resultset rs = st.executeQuery("SELECT something");
) {
   //Do stuff

} catch (SQLException e) {
   //Do stuff
}

І Java будзе клапаціцца пра яго для вас, і ён будзе зачыніць рэсурс у зваротным парадку. Глядзіце таксама Oracle падручнік па прымеркавай з-рэсурсаў :

<�Р> Звярніце ўвагу, што «блізкія» метады рэсурсаў называюцца ў супрацьлеглага парадак іх стварэння.

You can find a more in-depth look at try-with-resources in the article Better Resource Management with Java SE 7: Beyond Syntactic Sugar

Спецыфікацыя мовы Java для Java 7 згадак у раздзеле 14.20.3 :

<�Р> Рэсурсы ініцыялізуюцца злева-направа. Калі рэсурс не ўдаецца ініцыялізаваць (гэта значыць, яго выраз инициализатор кідае выключэнне), то ўсе рэсурсы ініцыялізуюцца да гэтага часу ў паспрабаваць Заява -з-рэсурсы зачыненыя. Калі ўсе рэсурсы ініцыялізацыі паспяхова, то паспрабаваць блок выконваецца ў звычайным рэжыме, а затым усё ненулявога рэсурсы паспрабаваць заяву -з-рэсурсы зачыненыя.      <�Р> Рэсурсы зачыненыя ў зваротным парадку ад таго, у якім яны былі ініцыялізаваны. Рэсурс зачынены толькі калі ён ініцыялізуецца ненулявое значэнне. Выключэнне з закрыцця аднаго рэсурсу не дапусціць закрыцця іншых рэсурсаў.

Гэта таксама можна разглядаць як відавочная прыкмета таго, што распрацоўшчыкі Java мовы разгледзець пытанне аб закрыцці рэсурсаў у зваротным парадку, яны дзе вылучаемай норму.

4
дададзена
Добра, зараз, што гэта правільна, я выдаліў мой downvote. Спасылка на JLS будзе прыемна завяршыць гэты адказ.
дададзена аўтар Aubin, крыніца
@Aubin Дададзены кароткае згадванне аб зваротным парадку, але я думаю, што StackOverflow не пра заўсёды адказваць на дакладнае пытанне, але і аб прадастаўленні лепшага адказу актуальнай праблемы. А паспрабуйце-с рэсурсамі вырашае пытанне, ухіляючы неабходнасць у самай справе думаць пра гэта.
дададзена аўтар Mark Rotteveel, крыніца
@Aubin абнавіў свой адказ, хоць у маім чытанні JLS ён відавочна згадвае выключэнне ў адным канцы, не перашкаджае іншым блізка :. «<�Я> Выключэнне з закрыцця аднаго рэсурсу не дапусціць закрыцця іншых рэсурсаў </я> »(вядома, гэта можа азначаць, што канкрэтны рэсурс вы спрабуеце зачыніць ня быў зачынены, але гэта таксама адбываецца без прымеркі з-рэсурсаў
дададзена аўтар Mark Rotteveel, крыніца
Гэта правільны адказ. +1
дададзена аўтар SnakeDoc, крыніца
@Aubin вы памыляецеся. Калі ласка, выдаліце ​​ваш -1 з гэтага адказу таксама. парадак ARM блокаў не мае значэння, віртуальная машына клапоціцца пра яго. Гэта дае адказ на пытанне, што ОП лепш, чым ОП чакалася.
дададзена аўтар SnakeDoc, крыніца

Вы павінны закрыць рэсурсы ў зваротным парадку вы адкрылі (як калі б гэтыя рэсурсы на стэку).

З Java 7 прымеркавай з-рэсурсамі, ідэальны спосаб:

try (
   Connection conn = somethingThatGetsAConnection();
   Statement st = conn.createStatement();
   Resultset rs = st.executeQuery("SELECT something");
) {
   //Do stuff

} catch (SQLException e) {
   //Do stuff
}

І Java будзе клапаціцца пра яго для вас, і ён будзе зачыніць рэсурс у зваротным парадку. Глядзіце таксама Oracle падручнік па прымеркавай з-рэсурсаў :

<�Р> Звярніце ўвагу, што «блізкія» метады рэсурсаў называюцца ў супрацьлеглага парадак іх стварэння.

You can find a more in-depth look at try-with-resources in the article Better Resource Management with Java SE 7: Beyond Syntactic Sugar

Спецыфікацыя мовы Java для Java 7 згадак у раздзеле 14.20.3 :

<�Р> Рэсурсы ініцыялізуюцца злева-направа. Калі рэсурс не ўдаецца ініцыялізаваць (гэта значыць, яго выраз инициализатор кідае выключэнне), то ўсе рэсурсы ініцыялізуюцца да гэтага часу ў паспрабаваць Заява -з-рэсурсы зачыненыя. Калі ўсе рэсурсы ініцыялізацыі паспяхова, то паспрабаваць блок выконваецца ў звычайным рэжыме, а затым усё ненулявога рэсурсы паспрабаваць заяву -з-рэсурсы зачыненыя.      <�Р> Рэсурсы зачыненыя ў зваротным парадку ад таго, у якім яны былі ініцыялізаваны. Рэсурс зачынены толькі калі ён ініцыялізуецца ненулявое значэнне. Выключэнне з закрыцця аднаго рэсурсу не дапусціць закрыцця іншых рэсурсаў.

Гэта таксама можна разглядаць як відавочная прыкмета таго, што распрацоўшчыкі Java мовы разгледзець пытанне аб закрыцці рэсурсаў у зваротным парадку, яны дзе вылучаемай норму.

4
дададзена
Добра, зараз, што гэта правільна, я выдаліў мой downvote. Спасылка на JLS будзе прыемна завяршыць гэты адказ.
дададзена аўтар Aubin, крыніца
@Aubin Дададзены кароткае згадванне аб зваротным парадку, але я думаю, што StackOverflow не пра заўсёды адказваць на дакладнае пытанне, але і аб прадастаўленні лепшага адказу актуальнай праблемы. А паспрабуйце-с рэсурсамі вырашае пытанне, ухіляючы неабходнасць у самай справе думаць пра гэта.
дададзена аўтар Mark Rotteveel, крыніца
@Aubin абнавіў свой адказ, хоць у маім чытанні JLS ён відавочна згадвае выключэнне ў адным канцы, не перашкаджае іншым блізка :. «<�Я> Выключэнне з закрыцця аднаго рэсурсу не дапусціць закрыцця іншых рэсурсаў </я> »(вядома, гэта можа азначаць, што канкрэтны рэсурс вы спрабуеце зачыніць ня быў зачынены, але гэта таксама адбываецца без прымеркі з-рэсурсаў
дададзена аўтар Mark Rotteveel, крыніца
Гэта правільны адказ. +1
дададзена аўтар SnakeDoc, крыніца
@Aubin вы памыляецеся. Калі ласка, выдаліце ​​ваш -1 з гэтага адказу таксама. парадак ARM блокаў не мае значэння, віртуальная машына клапоціцца пра яго. Гэта дае адказ на пытанне, што ОП лепш, чым ОП чакалася.
дададзена аўтар SnakeDoc, крыніца

Вы павінны закрыць рэсурсы ў зваротным парадку вы адкрылі (як калі б гэтыя рэсурсы на стэку).

З Java 7 прымеркавай з-рэсурсамі, ідэальны спосаб:

try (
   Connection conn = somethingThatGetsAConnection();
   Statement st = conn.createStatement();
   Resultset rs = st.executeQuery("SELECT something");
) {
   //Do stuff

} catch (SQLException e) {
   //Do stuff
}

І Java будзе клапаціцца пра яго для вас, і ён будзе зачыніць рэсурс у зваротным парадку. Глядзіце таксама Oracle падручнік па прымеркавай з-рэсурсаў :

<�Р> Звярніце ўвагу, што «блізкія» метады рэсурсаў называюцца ў супрацьлеглага парадак іх стварэння.

You can find a more in-depth look at try-with-resources in the article Better Resource Management with Java SE 7: Beyond Syntactic Sugar

Спецыфікацыя мовы Java для Java 7 згадак у раздзеле 14.20.3 :

<�Р> Рэсурсы ініцыялізуюцца злева-направа. Калі рэсурс не ўдаецца ініцыялізаваць (гэта значыць, яго выраз инициализатор кідае выключэнне), то ўсе рэсурсы ініцыялізуюцца да гэтага часу ў паспрабаваць Заява -з-рэсурсы зачыненыя. Калі ўсе рэсурсы ініцыялізацыі паспяхова, то паспрабаваць блок выконваецца ў звычайным рэжыме, а затым усё ненулявога рэсурсы паспрабаваць заяву -з-рэсурсы зачыненыя.      <�Р> Рэсурсы зачыненыя ў зваротным парадку ад таго, у якім яны былі ініцыялізаваны. Рэсурс зачынены толькі калі ён ініцыялізуецца ненулявое значэнне. Выключэнне з закрыцця аднаго рэсурсу не дапусціць закрыцця іншых рэсурсаў.

Гэта таксама можна разглядаць як відавочная прыкмета таго, што распрацоўшчыкі Java мовы разгледзець пытанне аб закрыцці рэсурсаў у зваротным парадку, яны дзе вылучаемай норму.

4
дададзена
Добра, зараз, што гэта правільна, я выдаліў мой downvote. Спасылка на JLS будзе прыемна завяршыць гэты адказ.
дададзена аўтар Aubin, крыніца
@Aubin Дададзены кароткае згадванне аб зваротным парадку, але я думаю, што StackOverflow не пра заўсёды адказваць на дакладнае пытанне, але і аб прадастаўленні лепшага адказу актуальнай праблемы. А паспрабуйце-с рэсурсамі вырашае пытанне, ухіляючы неабходнасць у самай справе думаць пра гэта.
дададзена аўтар Mark Rotteveel, крыніца
@Aubin абнавіў свой адказ, хоць у маім чытанні JLS ён відавочна згадвае выключэнне ў адным канцы, не перашкаджае іншым блізка :. «<�Я> Выключэнне з закрыцця аднаго рэсурсу не дапусціць закрыцця іншых рэсурсаў </я> »(вядома, гэта можа азначаць, што канкрэтны рэсурс вы спрабуеце зачыніць ня быў зачынены, але гэта таксама адбываецца без прымеркі з-рэсурсаў
дададзена аўтар Mark Rotteveel, крыніца
Гэта правільны адказ. +1
дададзена аўтар SnakeDoc, крыніца
@Aubin вы памыляецеся. Калі ласка, выдаліце ​​ваш -1 з гэтага адказу таксама. парадак ARM блокаў не мае значэння, віртуальная машына клапоціцца пра яго. Гэта дае адказ на пытанне, што ОП лепш, чым ОП чакалася.
дададзена аўтар SnakeDoc, крыніца

ResultSet, Statement and then the Connection. The golden rule to JDBC connections and statements is to close in the reverse order of initiation or opening. In addition, the ResultSet is dependant on the execution of the Statement and the Statement is dependant on the Connection instance. Hence, the closing should occur in that order (ResultSet, Statement, Connection).

0
дададзена

ResultSet, Statement and then the Connection. The golden rule to JDBC connections and statements is to close in the reverse order of initiation or opening. In addition, the ResultSet is dependant on the execution of the Statement and the Statement is dependant on the Connection instance. Hence, the closing should occur in that order (ResultSet, Statement, Connection).

0
дададзена

Першы прыклад гэта правільны шлях. Праблема з любым іншым таго, што закрыццё Заява будзе аўтаматычна зачыняць любую якая ляжыць у аснове ResultSet , а таксама (і тое ж самае можа адбыцца на працягу Connection ) - так што вам трэба, каб закрыць адзін нізкі ў іерархіі першых.

<�Код> блізка() метады могуць кінуць SQLException , так як @aubin паказаў. Простым рашэннем гэтай праблемы з'яўляецца выкарыстанне DBUtils closeQuietly() метад для іх закрыцця - то вам не трэба нават абнуліць праверыць!

0
дададзена

Першы прыклад гэта правільны шлях. Праблема з любым іншым таго, што закрыццё Заява будзе аўтаматычна зачыняць любую якая ляжыць у аснове ResultSet , а таксама (і тое ж самае можа адбыцца на працягу Connection ) - так што вам трэба, каб закрыць адзін нізкі ў іерархіі першых.

<�Код> блізка() метады могуць кінуць SQLException , так як @aubin паказаў. Простым рашэннем гэтай праблемы з'яўляецца выкарыстанне DBUtils closeQuietly() метад для іх закрыцця - то вам не трэба нават абнуліць праверыць!

0
дададзена

Каб вырашыць гэтую праблему з мінімальнымі намаганнямі, паспрабуйце выкарыстоўваць новы A.R.M. Java 7 у (Аўтаматычнае кіраванне рэсурсамі) Блокі, таксама вядомыя як Try-С-рэсурсы.

try (Connection conn = null, Statement st = null, ResultSet rs = null){
   //Do stuff

} catch (SQLException e) {
   //Do stuff
}

Няма непрыгожа Нарэшце або турбавацца аб правільным парадку, Java не клапоціцца пра гэта для вас.

Some more info regarding ARM/Try-With-Resources Blocks: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

0
дададзена
Калі ласка, дадайце гэтую спасылку на свой адказ:
дададзена аўтар Aubin, крыніца
Што аб парадку цесных аперацый? Гэта пытанне і не адказваць на яго ...
дададзена аўтар Aubin, крыніца
@SnakeDoc ў ARM закрыцця называюць у зваротным парадку размеркавання
дададзена аўтар Mark Rotteveel, крыніца
@SnakeDoc Я іду па гэтай навучальнай праграме вы таксама спасылкі на якія згадваюцца ў відавочным выглядзе (гл цытату ў маім адказе). AFAIK кампілятар фактычна пераўтворыць прымеркавай з-рэсурсы да, нарэшце, блок з некаторымі (комплекснай) апрацоўкі выключных сітуацый; гэта не нашмат больш, чым сінтаксічны цукар.
дададзена аўтар Mark Rotteveel, крыніца
Глядзіце таксама гэтую спасылку на прымеркі з-рэсурсаў (асабліва демистифицирована падзелу ў той канец): oracle.com/technetwork/articles/java/…
дададзена аўтар Mark Rotteveel, крыніца
@Mark вы ўпэўненыя? Я думаў, што яны закліканы быць зачыненыя ў парадку віртуальнай машына вырашыла, што азначае, як толькі сопп злучэння не выкарыстоўваюцца, ён будзе вызвалены і GC'ed. гэта азначае, праграміст не павінен думаць пра гэта.
дададзена аўтар SnakeDoc, крыніца
@Aubin яна адказвае на яго пытанне лепш. У ARM блоках заказ не мае значэння, ARM блокі былі вынайдзены, каб вырашыць гэтую праблему дакладна. Просім выдаліць -1
дададзена аўтар SnakeDoc, крыніца
@Mark я выпраўлюся. Я думаў, што гэта адведзенае гэта больш-так чым гэта робіць. Дзякуй за працяг.
дададзена аўтар SnakeDoc, крыніца
+1 прыемна сачыць за ссылку. Я прапусціў гэты падзел.
дададзена аўтар SnakeDoc, крыніца