Connection、ResultSet、Statementのclose処理について

このQ&Aのポイント
  • Connection、ResultSet、Statementのclose処理にはなぜ必要性があるのか
  • close処理を行わないと、メモリリソースが浪費され、サーバーのパフォーマンスが低下する可能性がある
  • また、close処理を行わないと、他のプログラムの実行に支障をきたすことがある
回答を見る
  • ベストアンサー

Connection、ResultSet、、Statementのclose処理について

Connection、ResultSet、Statementのclose処理について、 何となくは行わないといけない、ということはわかるのですが、 それがどうしてなのかがイメージとしてしっかりと具体化できませんでした。 これらのclose処理は一体どうして、行わないといけないのでしょうか?(必須ではないみたいですが、行った方がよい様子でしたので) データベースつなぎっぱなしの「connectionが繋がったまま」という状況がダメだというのは何となく「ああ、そうなんだ」と思えるはしますが・・・ それでも「何がどうなるからダメであるのか」がいまいち、ボヤけている状態です。 【参考URL】 http://www.atmarkit.co.jp/fjava/rensai2/jspservlet10/jspsevlet10_1.html 「 ■データベースや結果セットは明示的にクローズすべきか 」 より、内容をみてみたところ >不要なリソースをいつまでもメモリ上に残すということは、限りあるサーバリソースを浪費するという意味でも好ましいことではありません。 ともありましたが、 ここの「限りあるサーバーリソースを浪費する」というのは、 サーバー上にある「数少ないメモリ領域を、ResultSetなり、Statementなりが占領してしまう」ことにより、他のプログラムを動かせなくなってしまうから、ということなのでしょうか?

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • zionic
  • ベストアンサー率39% (31/79)
回答No.1

メモリもそうですが、データベースに対するコネクションも使っているので場合によっては、データベースに接続できないプログラムも出てきたりします。 それが、処理の優先順位の高いプログラムだったりすると怒られるだけじゃすまないこともあります。 なので、必要の無いものはクローズするべきだと思います。

Guno-this
質問者

お礼

どうも、ありがとうございます。 メモリのリソースを食うだけじゃ済まないのですね^^; 「コネクションをずっと持っておく」というのは危険性なことなのですね。

関連するQ&A

  • StatementとResultSetのclose()について

    こんにちは。 少し質問なんですが、jdbcを使用してDBとデータのやり取りが終わった後に StatementとResultSetをクローズしないでConnectionだけをクローズすると どうなりますか? StatementとResultSetもガーベージコレクションによりクローズされるのでしょうか? 少し気になったので、どなたか教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • DBを扱う上でのclose()メソッドの必要性

    JavaでDBにアクセスする為の勉強中です。 使用しているクラスは Connection、Statement、ResultSet でそれぞれfinallyの部分でclose()メソッドを呼んでいます 例えばこのときStatementのJavaDocでclose()メソッドの説明を読むと >自動的にクローズされるときに Statement オブジェクトのデータベースと JDBC リソースが解放されるのを待つのではなく、ただちにそれらを解放します。 とあり、該当のメソッドを呼ばなくても、リソースは解放されるようですが、ただちに解放する必要性はどこにあるのでしょうか? 検索結果で表示されるサイト等も大半はclose()が書かれていますが、 おまじない的な話しか載ってるのを見る程度でした。

  • javaのResultSetについて

    現在、javaの勉強中です。 そこで、ResultSetについて質問があります。 私は、今まで主にC#で開発をやっていました。 C#だと、クライアント(WindowsForm) → Webサーバー → APサーバー → DB という構成で、サーバー間をデータセットでやり取りしていました。 ただ、javaは私のコーディングミスかもしれませんが、DBサーバーで取得した値を ResultSetに入れて、Connectionやら、StatementをCloseすると、ResultSetも消滅してしまっています。 こういう場合は、取得直後に、なにか別のクラス変数などに移し変えるのが正しいのでしょうか? ただ、そうなると、私の勝手な考えですが必要な列分の配列変数が必要なのでは?と、思ってしまっていて、 そうなると、ナンセンスだな・・・・と思っています。 ほかに何か良いやり方はあるのでしょうか? それとも、そもそも、DB接続の専用クラスというものはJavaに必要なのでしょうか? (上記のC#の考えでいけば、間のWebサーバーとAPサーバーが不要?) よろしくお願いします。

    • ベストアンサー
    • Java
  • JDBCプログラミング

    以下のプログラムは、DBkanri.javaというファイル名で、データベースに接続してデータを取得し、取得したデータを表示させるJSPファイルとともに使います。これを、テーブルの作成、レコード追加、フィールド 追加等の更新をし、更新後のデータも取得できるようなプログラムにアレンジしたいのですが、 どなたか、アドバイスください。お願いします。 ちなみに環境は、tomcat3.2.1 JDK1.3.1_02MS Access2000です。 package Kadai; import java.sql.*; public class DBkanri{ private String driver; private String url; private String user; private String password; private Connection connection; private Statement statement; private ResultSet resultset; public DBkanri(){ driver="sun.jdbc.odbc.JdbcOdbcDriver"; url="jdbc:odbc:CONNECTION"; user="abcde"; password="12345"; } public synchronized void open() throws Exception { Class.forName(driver); connection=DriverManager.getConnection(url, user, password); statement=connection.createStatement(); } public ResultSet getResultSet(String sql) throws Exception { if ( statement.execute(sql) ){ return statement.getResultSet(); } return null; } public void execute(String sql) throws Exception { statement.execute(sql); } public synchronized void close() throws Exception { if( resultset != null ) resultset.close(); if( statement != null ) statement.close(); if( connection != null ) connection.close(); } }

  • DBのコネクションのclose処理で例外が発生した場合

    DBのコネクションのclose処理で例外が発生した場合 DBアクセスが終わった後、finallyでResultSetやConnection、PreparedStatementのclose処理を行うと思います。 } finally { if (result != null) { try { result.close(); } catch (SQLException e) { } } if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (conn != null) { try { conn.close(); } catch (SQLException e) { } } } 上記では各close処理で例外が発生した場合、何もしていませんがこのあたりの処理は何を行うべきなのでしょうか。 例えばログ出力をして例外をそのまま上位にスローするなどでしょうか。 close処理で例外が発生するのは余程のことだと思うのですが、ログ出力以外で何かやるべき処理はありますでしょうか。

    • ベストアンサー
    • Java
  • JavaからMDB接続について

    下記PGについて ------------------------------------ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ClassDatabase { public static Connection connection; public static Statement statement; public static ResultSet resultSet; public void main(String DBNM) { try { // Load the UCanAccess JDBC driver Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); // Define the database URL String url = "jdbc:ucanaccess://" + DBNM + ";"; // Establish the connection DB_CONNECT(url); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void DB_CONNECT(String url) { try { connection = DriverManager.getConnection(url); } catch (SQLException e) { e.printStackTrace(); } finally { // Close the connection when you're done if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } ------------------------------------ connection = DriverManager.getConnection(url);の所ですが応答が帰って来ないほど遅いのですがどうにかなりますでしょうか? MDBと接続はできています。(整合性チェック等を行っているようです、させない方法等ありますでしょうか?)

    • ベストアンサー
    • Java
  • resultsetによるDBへのレコード追加

    できるかできないかだけでも教えてください。 お願いいたします。 ACCESSへレコードの追加を Resultsetによってしたいと思います。 環境1 WIN2000(SP2) Forte3.0 JDK1.4 ACCESS2000  では、以下のプログラムが一部(rs.moveToCurrentRow())を除き動きます。 環境2(ハードウェアの状態よりバージョンがあげられません) win98(SP2?) Forte2 JDK1.3 ACCESS2000  では、   rs.insertRow()  で例外が発生します。 ODBCドライバのバージョンは両環境とも.6019です。 JDBCドライバのバージョンがこの原因と思われますが、 JDBCドライバあげる方法もわかりませんし、手の打ちようがありません。 環境2で insertRow の動作の仕方など ご存知の方ぜひ教えてください。 ソース try{ String drv = "sun.jdbc.odbc.JdbcOdbcDriver"; String url = "jdbc:odbc:データベース名"; String usr = ""; String pw = ""; Connection con; Statement st; //接続 Class.forName(drv); con = DriverManager.getConnection(url, usr, pw); st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,                 ResultSet.CONCUR_UPDATABLE);   String qry="SELECT * FROM T_table"; ResultSet rs = st.executeQuery(qry); rs.moveToInsertRow(); //データ入力 rs.updateString(1,"データ");   //省略 //insertRowが動かない rs.insertRow(); rs.moveToCurrentRow(); con.commit(); }catch(Exception e){ // System.exit(0); } }

    • ベストアンサー
    • Java
  • jspコードが実行できない

    こんにちは、お世話になります。 debian12のtomcat10でjspコードが実行できずに困っております。 エラーの詳細です。 HTTPステータス 500 – Internal Server Error タイプ 例外報告 メッセージ JSPのクラスをコンパイルできません: 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません: JSPファイル: [/sample.jsp] の中の [8] 行目でエラーが発生しました Type mismatch: cannot convert from Object to String 5: <body> 6: <% 7: String userDisplayName = request.getParameter("userdisplayname"); 8: String userSession = session.getAttribute("userid"); 9: String dbQuery = "INSERT INTO users (userDisplayName) VALUES(?) WHERE userId = ?"; 10: PreparedStatement statement = connection.prepareStatement(dbQuery); 11: statement.setString(1, userDisplayName); JSPファイル: [/sample.jsp] の中の [10] 行目でエラーが発生しました PreparedStatement cannot be resolved to a type 7: String userDisplayName = request.getParameter("userdisplayname"); 8: String userSession = session.getAttribute("userid"); 9: String dbQuery = "INSERT INTO users (userDisplayName) VALUES(?) WHERE userId = ?"; 10: PreparedStatement statement = connection.prepareStatement(dbQuery); 11: statement.setString(1, userDisplayName); 12: statement.setString(2, userSession); 13: statement.executeUpdate(); JSPファイル: [/sample.jsp] の中の [10] 行目でエラーが発生しました connection cannot be resolved 7: String userDisplayName = request.getParameter("userdisplayname"); 8: String userSession = session.getAttribute("userid"); 9: String dbQuery = "INSERT INTO users (userDisplayName) VALUES(?) WHERE userId = ?"; 10: PreparedStatement statement = connection.prepareStatement(dbQuery); 11: statement.setString(1, userDisplayName); 12: statement.setString(2, userSession); 13: statement.executeUpdate(); JSPファイル: [/sample.jsp] の中の [18] 行目でエラーが発生しました Statement cannot be resolved to a type 15: 16: // Retrieval of potentially vulnerable data from the database 17: <% 18: Statement statement = connection.createStatement(); 19: ResultSet result = statement.executeQuery("SELECT * FROM users LIMIT 10"); 20: %> 21: The top 10 latest users to sign up:<br /> JSPファイル: [/sample.jsp] の中の [18] 行目でエラーが発生しました Duplicate local variable statement 15: 16: // Retrieval of potentially vulnerable data from the database 17: <% 18: Statement statement = connection.createStatement(); 19: ResultSet result = statement.executeQuery("SELECT * FROM users LIMIT 10"); 20: %> 21: The top 10 latest users to sign up:<br /> JSPファイル: [/sample.jsp] の中の [18] 行目でエラーが発生しました connection cannot be resolved 15: 16: // Retrieval of potentially vulnerable data from the database 17: <% 18: Statement statement = connection.createStatement(); 19: ResultSet result = statement.executeQuery("SELECT * FROM users LIMIT 10"); 20: %> 21: The top 10 latest users to sign up:<br /> JSPファイル: [/sample.jsp] の中の [19] 行目でエラーが発生しました ResultSet cannot be resolved to a type 16: // Retrieval of potentially vulnerable data from the database 17: <% 18: Statement statement = connection.createStatement(); 19: ResultSet result = statement.executeQuery("SELECT * FROM users LIMIT 10"); 20: %> 21: The top 10 latest users to sign up:<br /> 22: <% while(result.next()) { %> Stacktrace: org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:214) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:513) org.apache.jasper.compiler.Compiler.compile(Compiler.java:402) org.apache.jasper.compiler.Compiler.compile(Compiler.java:372) org.apache.jasper.compiler.Compiler.compile(Compiler.java:356) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:396) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328) jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 解る方いましたら、ご教示お願いします。

  • JDBC Connectionを開放し続ける方法

    JDBC経由でOracleに接続して、接続しっぱなしにしたいのですが、どうすればいいのかよくわかりません。 とりあえず正常終了するようなソースを書いてみました。このソースからconnectionをCloseしないように編集したいのですが、どうすればいいのかわかりません。 やりたいことはJDBCの複数同時Connectionを試したくて、このConnectionを維持したまま、何回かこのプログラムを実行すればいいかなと思っているんですが。 長くなりましたが、よろしくお願いします。 import java.sql.*; class Employee { public static void main (String args []) throws SQLException { // Load the Oracle JDBC driver DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); // Connect to the database // You must put a database name after the @ sign in the connection URL. // You can use either the fully specified SQL*net syntax or a short cut // syntax as <host>:<port>:<sid>. The example uses the short cut syntax. Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@HOST:PORT:SID", "scott", "tiger"); // Create a Statement Statement stmt = conn.createStatement (); // Select the ENAME column from the EMP table ResultSet rset = stmt.executeQuery ("select ENAME from EMP"); // Iterate through the result and print the employee names while (rset.next ()) System.out.println (rset.getString (1)); } }

    • ベストアンサー
    • Java
  • JDBCのバグ?それともプログラム(Java)のバグ?

    JavaからJDBC経由でPostgreSQLにSELECT文を発行し、 結果を受けて更に処理をするプログラムを作成しております。 その際、SELECTの結果をResultSet.next()メソッドを使い、 while文で結果の行数分処理をしようとしております。 しかし、複数行SELECT文の結果があるにもかかわらず、 1回のループで終わってしまい、 後は下記のExceptionが発生してしまいます。 Exceptionを読む限りでは、コネクションが閉じられていると分かるのですが、 プログラムでは一番最後のステップでデータベースとの切断をしております。 この様な現象のときは、JDBCが悪いのでしょうか?それともプログラムのつくりが悪いのでしょうか? 【 以下サンプルソース 】 Connection con = null; Statement st = null; ResultSet rs = null; try{ Class.forName("org.postgresql.Driver"); con = DriverManager.getConnection(jdbc:postgresql://localhost:5432/hoge?user=hoge&password=hoge); st = con.createStatement(); rs = st.executeQuery("select hogehoge from hogerake"); // 必ず複数行戻ります。 while(rs.next()){ // 処理 } con.close(); st.close(); rs.close(); }catch(Exception e){ e.printstackTrace(); } 【 以上サンプルソース 】 【 以下コンソール 】 org.postgresql.util.PSQLException: Connection is closed. Operation is not permitted. at org.postgresql.jdbc1.AbstractJdbc1ResultSet.next(AbstractJdbc1ResultSet.java:134) at jp.co.comsys.felica.ExitManagement.main(ExitManagement.java:10) 【 以上コンソール 】

専門家に質問してみよう