• 締切済み

DBを扱う上でのclose()メソッドの必要性

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

noname#86743
noname#86743
  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

コネクションの場合明示的にCLOSEしない場合自動的にCLOSEする時間がくるまでCLOSEされなっかったりします。(設定しない場合デフォルト値、1~3分くらい?) 例) 最大コネクション数が10、コネクション自動CLOSEまで180秒という設定のDBがあったとします。 この場合、3分間の間にあるユーザーが10回接続して来た場合コネクションが自動的にCLOSEされて開きが出るまで他のユーザーが使用できなくなります。

関連するQ&A

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

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

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

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

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

    • ベストアンサー
    • 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
  • javaのResultSetについて

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

    • ベストアンサー
    • Java
  • DBサーバ上でjdbcによるアクセス方法について

    Oracle JDBC Driverのロードを以下のように行おうとしました。 import java.sql.*; class JavaDataAccess01 { public static void main (String args[]) throws SQLException, ClassNotFoundException { // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracle10gに接続 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ORCL", "test", "test"); // ステートメントを作成 Statement stmt = conn.createStatement(); // 問合せの実行 ResultSet rset = stmt.executeQuery("select brand_id,value from brand"); // 問合せ結果の表示 while ( rset.next() ) { // 列番号による指定 System.out.println(rset.getInt(1) + "\t" + rset.getString(2)); } // 結果セットをクローズ rset.close(); // ステートメントをクローズ stmt.close(); // 接続をクローズ conn.close(); } } コンパイル後実行すると以下のように例外がでます。 Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.driver. OracleDriver at java.net.URLClassLoader$1.run(URLClassLoader.java:199) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:187) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:141) at JavaDataAccess01.main(JavaDataAccess01.java:11) ちなみにコンパイルして作成したクラスファイルはJavaDataAccess01です。使用しているDBはoracle10gです。環境設定もCLASSPATHにD:\oracle\product\10.2.0\db_1\jdbc\lib\classes12.zipを追加しているのですがどうにもうまくいきません。どなたか解決方法がわかる方、ご教授お願いします。

  • JDBC PostgreSQLで必要なファイルはあるのでしょうか?

    LinuxでPostgreSQLのデータベースをJDBCでアクセスしたいのですが、以下のソースで次のエラーが発生します。何か必要なファイルでもあるのでしょうか? java.lang.ClassNotFoundException:org.postgres.Driver また、LinuxのODBCも必要なファイルがあるのでしょうか? import java.sql.*; class jdbcSample2 { public static void main(String argv[]) { int a; String b; try { //Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); //String url = "jdbc:odbc:test"; Class.forName ("org.postgres.Driver"); String url = "jdbc:postgresql://127.0.0.1:5432/test"; String user = ""; String password = ""; Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement (); String query = "select * from member;"; ResultSet rs = stmt.executeQuery (query); while(rs.next()){ a = rs.getInt(1); b = rs.getString(2); System.out.println(a + ", " + b); } rs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } } }

専門家に質問してみよう