• ベストアンサー

StatementとResultSetのclose()について

ct27の回答

  • ベストアンサー
  • ct27
  • ベストアンサー率62% (48/77)
回答No.1

Statement#close()およびResultSet#close()をやらないのは非常にお行儀が 悪いので絶対やりましょう。他の人が見たときに「なんでcloseしないの?」 と疑問に思うことでしょう。 あとループでぐりぐりまわしつつ処理した時などに「最大カーソル数を越えました」 というエラーが出ることがありますから絶対closeした方がいいです。 ちなみにDBに関係するリソースはいらなくなったらすぐcloseした方が安全のようです。 プログラム側だけでなくDB側のリソースも解放することで無用なトラブルを減らすと ある本に書いてありました。

関連するQ&A

  • 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
  • ResultSetのクローズについて

    下記のURLの質問で、アクションクラスと、DB接続クラスは分けるのが普通だということは分かりましたが、 そうなると、ResultSetとか、Connectionとかのクローズのタイミングが、いまいち分かりません。 イメージ的には、そのDB接続クラス内でクローズするのが正しいとは思うのですが・・・。 でも、そうすると、取得した結果を呼び出したアクションクラスに渡せない・・・。 どうすれば、いいのでしょうか? http://okwave.jp/qa/q6345240.html

    • ベストアンサー
    • 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
  • 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
  • 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(); } }

  • WebSphere/DB2/ResultSet close/Exception

    WebSphereを使って、Listenerで取得したデータソースを利用していますが、 String sql1 = "SELECT A1 FROM TEST1"; String sql2 = "SELECT B2 FROM TEST2 WHERE B1 = ?"; Connection conn = datasource.getConnection(); PreparedStatement ps1 = conn.preparedStatement(sql1); ResultSet rs1 = ps1.executeQuery(); while(rs1.next()){ PreparedStatement ps2 = conn.preparedStatement(sql2); ps2.setString(1,rs1.getString("A1")); ResultSet rs2 = ps2.executeQuery(); ps2.close(); } このロジックで、ps2をクローズすると、ps1で取得したResultSet rs1がクローズされるというExceptionが発生してしまいます。 (ループして戻ったときにrs1.next()でexceptionが起こる) なにか対処方法があるかご存知の方いらっしゃいましたら、よろしくお願いいたします。

    • ベストアンサー
    • 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
  • ResultSet での問題

    だいたいのプログラム内容: login.htmlでログインを試み、そこからメールアドレス、パスワードがerrormsg.jspにパラメータで送られ、errormsg.jspからLoginBean.java(bean)を使いSQLデータに入ってるメールアドレス、パスワードと照らし合わされ、データに登録されていなかったら、エラーメッセージが返され、合っていたらwelcom.htmlページに送られます。 たまたま@ITで似たような内容があったので、基本的には同じように作りました。 でも、うまくデータを照合し分けることができません。パラメータは調べたらきちんと通っており。ResultSetの所に問題があると分かりました。 以下はLoginBean.javaの主な問題コードです。 public boolean confirm(){ try{ //SQLへの接続省略してます String sql_str = "SELECT email, password FROM customer where email='"+email+"'AND password='"+password+"'"; //ここが問題の部分です。 ResultSet rs = stmt.executeQuery(sql_str); if(rs!=null){ rs.close(); stmt.close(); connection.close(); return true; } else{ rs.close(); stmt.close(); connection.close(); return false;} }catch(SQLException e) { return false; }catch(Exception e){ e.printStackTrace(); return false;}}} このように、パラメータからきたアドレスパスワードを使い、SQLのSELECTで検索されたものをrsに返し、rsが空でなければ、trueを返します。(このメソッドはerromsg.jspから呼ばれます。)しかしデータに登録さてないものでもrsがnullでないと判断され、trueが帰ってきます。

    • ベストアンサー
    • Java
  • ResultSetオブジェクトのメソッドについて

    AccessでつくったRDBにJDBCで接続してデータを表示させたいのですが、ResultSetオブジェクトのprevious()メソッドやfirst()メソッドを使うとうまくいまず困ってます。 下記のプログラムを実行するとエラーになります。 ------------------------------------------------ (省略) int r = 0; while(resultset.next()){ r++; } while(resultset.first()){ } ------------------------------------------------ 又は ------------------------------------------------ (省略) int r = 0; while(resultset.next()){ r++; } while(resultset.previous()){ String 変数名 = resultset.getString("フィールド名"); // タイトル名を取得/ (省略) ------------------------------------------------ エラー ----------------------------------------------- javax.servlet.ServletException: Result set type is TYPE_FORWARD_ONLY ----------------------------------------------- #カーソルのバックはできない? next()メソッドを使った後に、取得したデータの処理はどの様にすればよいのかがわかりません。 ご教授お願いします。

    • ベストアンサー
    • Java