JDBCのバグ?それともプログラム(Java)のバグ?

このQ&Aのポイント
  • JavaからJDBC経由でPostgreSQLにSELECT文を発行し、結果を受けて更に処理をするプログラムを作成しています。
  • しかし、複数行SELECT文の結果があるにもかかわらず、1回のループで終わってしまい、コネクションが閉じられたというExceptionが発生してしまいます。
  • この現象はJDBCのバグなのか、プログラムのつくりが悪いのか疑問です。
回答を見る
  • ベストアンサー

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) 【 以上コンソール 】

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

  • ベストアンサー
  • vivlet
  • ベストアンサー率36% (24/66)
回答No.1

while の処理の中で st に対して再度SQLを発行してたり、rs を上書きしてたりしませんか? でなければ通常Exceptionは出ないと思われるのですが… あとcloseの順番は rs、st、con の順番の方が良いと思われます。

susumufire
質問者

お礼

早速のご回答ありがとうございます。 正に、whileの中で再度SQLを発行しておりました。 Statementを別名でもう一つ宣言しましたら、 きれいに処理が終わりました。 ありがとうございました。

関連するQ&A

  • Postgresql JDBCのconnect error

    Vine Linux2.6, Tomcat5, Postgresql7.4.3の環境で、 簡単なDBへアクセスのJspを作りましたが、実行したら、次のエラーができましたが、解決方法を 教えてください。 JSP File: <HTML> <HEAD><TITLE>User List</TITLE></HEAD> <BODY> <%@ page import="java.sql.*" %> <TABLE BORDER=1 width="75%"> <TR><TH>UID</TH><TH>Password</TH></TR> <% Connection conn = null; Statement st = null; ResultSet rs = null; try { Class.forName("org.postgresql.Driver").newInstance(); conn = DriverManager.getConnection("jdbc:postgresql://xxx.xxxx.xx.xx:8080/webshop","postgres","xxxx"); st = conn.createStatement(); rs = st.executeQuery("select * from tbllogin"); while(rs.next()) { %> <TR><TD><%= rs.getString("fldlogid") %></TD> <TD><%= rs.getString("fldpwd") %></TD></TR> <% } %> </TABLE> <% } catch (Exception ex) { ex.printStackTrace(); %> </TABLE> Ooops, something bad happened: <% } finally { if (rs != null) rs.close(); if (st != null) st.close(); if (conn != null) conn.close(); } %> </BODY> </HTML> Tomcat5のログcatalina.out: org.postgresql.util.PSQLException: The backend has broken the connection. Possibly the action you have attempted has caused it to close. at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:168) at org.postgresql.jdbc1.AbstractJdbc1Connection.openConnectionV3(AbstractJdbc1Connection.java:291) .....

  • postgresql接続時

    お世話になっています。 現在、postgresqlに接続し、指定のデータがなければ、dbを切断し、 切断中に、dbに接続されたら、エラーを発生させるようなプログラムを作成しています。 その際、org.postgresql.util.PSQLException: This ResultSet is closed.のようなエラーが発生します。 原因として、ResultSetにあるというのはわかるのですが、 ソースは、以下のように組んでいます。 static Connection con = null; static Statement stmt = null; static ResultSet rs ;; try { Class.forName("org.postgresql.Driver"); // PostgreSQLの場合 con = DriverManager.getConnection ("jdbc:postgresql:sample","moon","post"); // ステートメントオブジェクトを生成 stmt = con.createStatement(); String sql = " select id,pw from login where id='test' and pw='a'"; System.out.println(sql); // クエリーを実行して結果セットを取得 rs = stmt.executeQuery(sql); boolean ba = rs.next(); //もし、idがなければ、dbを閉じる if(ba == false) { System.out.println("rs:"+rs.next()); stmt.close(); con.close(); rs.close(); } catch (SQLException e) { } catch (ClassNotFoundException c) { } catch(Exception es) { } finally { } //この時点で、指定のid,pwが存在していないので、dbは切断中 //この状態でdbにアクセスする String sql = " select * from login"; // クエリーを実行して結果セットを取得 try { // ここから if(con !=null && stmt != null && rs !=null) { while(rs.next()) { System.out.println(rs.getString("id")); } }//ここまでが、何かがおかしい else {} } catch (SQLException e) {} この場合、どこが間違っているのでしょうか? 宜しくお願いします。

  • 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 (); } } }

  • eclipseにてPostgresへの接続

    当方、eclipseにてPostgresqlへ接続するAndroidのアプリを開発しておりますが、 どうしてもエラーにて接続ができません... ご存知の方ご教授のほどよろしくお願いいたします。 JDK version 1.6.0_35 Postgresql 8.1.23 ダウンロードしてきたJDBCはpostgresql-9.2-1000.jdbc4.jar エラーが出る箇所は int count = 0; String sql = "test"; try{ Class.forName("org.postgresql.Driver").newInstance(); ←【ここでエラー】 Connection con = DriverManager.getConnection("jdbc:postgresql://192.168.1.3/test_db","hoge","hoge"); Statement stmt = con.createStatement(); sql = "select * from customer"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ count++; } }catch(SQLException e){ Log.v("SQLException:",e.getMessage()); }catch (Exception e1) { // TODO: handle exception Log.v("DBエラー", e1.getMessage()); }finally{ Toast.makeText(this, Integer.toString(count), Toast.LENGTH_LONG).show(); } エラー内容は『org.postgresql.Driver』と出ます。 システム環境変数からPathも通してあります。 何か考えられる原因はありますでしょうか? 参考までにNavicatなどでDBの閲覧はできる状況になっております。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • JDBC接続について

    お世話になります。 MSDE2000にJDBCにて接続したいのですが、SQLExceptionが発生して接続できません。 JDBCドライバーはMSよりDLして、CLASSPATHに追加しております。 環境は OS:Win2K Pro JAVA:jdk1.3.1_18 です。 JAVAのソースは下記のとおりです。 import java.sql.*; import java.io.*; import java.util.*; public class SQLServerJDBCTest { public static void main(String[] args) { // ログインに必要な情報 String user = "sa"; //ユーザ名 String pass = "password"; //パスワード try { // ドライバクラスをロード Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); // データベースへ接続 Connection con = DriverManager.getConnection ("jdbc:microsoft:sqlserver://127.0.0.1:1433",user,pass ); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); // クエリーを実行して結果セットを取得 String sql = "SELECT GETDATE()"; ResultSet rs = stmt.executeQuery(sql); // 表示 while (rs.next()) { System.out.println(rs.getString(1)); } // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } おかしな点や追加設定等ありましたらご指摘ください。 (投稿文字制限でExceptionの内容が載せられませんでした。) また、MSDEのバージョン7に接続する場合、同じJDBCドライバーで、同じ設定でいいのでしょうか? よろしくお願いいたします。

  • java.lang.NoClassDefFoundErrorというエラーが出ます

    ご質問させて頂きます。 自分のPC(XP)からTelnetで LINUX(Red Hat Linux release 9 (Shrike))に接続しています。 サンプルを参考にして以下のコードを作ってみました。 これは、PostgreSQLで作成したデータベース(aa)の テーブル(test)のデータを表示させようとしています。 import java.sql.*; public class sample1{  public static void main(String [] args){   String driver = "org.postgresql.Driver";   String url = "jdbc:postgresql://192.178.215.230/home/postgres/data/aa";   try{     Class.forName(driver);     Connection con = DriverManager.getConnection(url,"postgres","aaaa");     Statement st = con.createStatement();     ResultSet rs = st.executeQuery("SELECT * FROM test");      System.out.println("shainno shimei ");     while ( rs.next() ){        System.out.println(" "+rs.getInt("shainno")+" "+ rs.getString("shimei"));     }     rs.close();      st.close();      con.close();     }catch (SQLException sqlEx){     System.out.println("SQLERROR: " + sqlEx.toString());   }catch (Exception ex){     ex.printStackTrace();   }  } } これを実行すると、 [postgres@localhost postgres]$ java sample1 以下のようなエラーが出てします。 Exception in thread "main" java.lang.NoClassDefFoundError: sample1 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • データ数をカウントしたいのですが

    JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは Connection con = null; String sql = "select count(*) from テーブル名"; // コネクションを作成する。 con = DriverManager.getConnection(url, user, pass); Statement st = con.createStatement(); // SQLを実行する。 ResultSet rs = st.executeQuery(sql); String count = rs.getString("count(*)"); 実行した結果上手く出来ないのですが、この部分での間違いはありますか?

    • ベストアンサー
    • Java
  • JDBCについて

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; public class DBtest { public static void main(String[] args){ try { Connection con = null; PreparedStatement ps = null; String url = "jdbc:mysql://localhost/address"; String user = "test"; String password = "pass"; con = DriverManager.getConnection(url, user, password); Statement st = (Statement) con.createStatement(); Statement st2 = (Statement) con.createStatement(); String sql = "SELECT * FROM data2"; ResultSet rs = st2.executeQuery(sql); try { System.out.println("ok"); // ここでクエリを実行 while(rs.next()){ System.out.println(rs.getString("name")+rs.getString("age")); } //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader na = new BufferedReader(new InputStreamReader(System.in)); String Na = na.readLine(); String ins = "INSERT INTO data2(name,age)VALUES('?',20)"; ps = (PreparedStatement) con.prepareStatement(ins); ps.setString(1,Na); ps.executeUpdate(); //INSERT実行 int rs2 = st2.executeUpdate(ins); System.out.println(rs2); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } finally { // 直前の try ブロックに入ったら、ここは必ず実行される con.close(); } } catch (SQLException ex) { System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); // 接続できない時 } } } 現在javaでmysqlに接続してDB内の検索や追加等を行うものを作成しています。 現状は入力されたものをDBに追加することまでできましたが 検索で 入力された値がDBの中に一致する、または部分一致したものを表示させるやり方がわかりません

    • ベストアンサー
    • Java
  • mysqlへの接続が出来ません

    まずは、サンプルプログラミングをコピーして実行してみましたが、上手くいきません。 package Connection; import java.sql.*; public class DBtest { public static void main(String[] args) { //java.sql Connection con = null; Statement stmt = null; ResultSet rs = null; String sqlStr; try { //ドライバクラスをロードする Class.forName("org.gjt.mm.mysql.Driver"); //MySQLに接続 con = DriverManager.getConnection("jdbc:mysql://localhost/dbname", "8080", "password"); //ステートメント生成 stmt = con.createStatement(); //SQL文 sqlStr = "SELECT * FROM TABLE"; //SQL文実行 rs = stmt.executeQuery(sqlStr); //検索結果数だけループ while(rs.next()){ //レコードの値 int id = rs.getInt("ID"); String name = rs.getString("NAME"); //表示 System.out.println(id + ":" + name); } //クローズ rs.close(); stmt.close(); con.close(); } catch (Exception ex) { try { //クローズ if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (Exception e) { } //エラー ex.printStackTrace(); } } } 上記はEclipseでは文法エラーはありません。で実行してみると java.sql.SQLException: Access denied for user '8080'@'localhost' (using password: YES)になります。 サンプルにはDbname、ID,Passとあるので実際のDbnameとパスワードを入れているのですが駄目です。 IDは意味が良くわからないので8080を入れてみました。 どなたか教えて下さい。お願いします。 尚、当方全くの初心者です宜しくお願い致します。

    • ベストアンサー
    • Java
  • Java PostgreSQL スクリプトレット

    スクリプトレットを使用し、ログイン画面を作成しようと考えています。 <%@ page import="java.io.*,javax.servlet.*,javax.servlet.http.*,java.net.*,java.sql.*" %> <% request.setCharacterEncoding("Shift_JIS"); String id = (String)request.getParameter("id"); String pass = (String)request.getParameter("pass"); String drv = "org.postgresql.Driver"; String dsn = "jdbc:postgresql://localhost:5432/?user=postgres&password=aipo"; String sql = "SELECT * FROM TURBINE_USER"; Connection cn = DriverManager.getConnection(dsn); Statement st = cn.createStatement(); ResultSet rs = st.executeQuery(sql); while (rs.next()) { out.println("<P>" + rs.getString(1) + "</P>"); } rs.close(); st.close(); cn.close(); %> 上記を実行すると org.apache.jasper.JasperException: Exception in JSP: /get.jsp:18 となり、 ResultSet rs = st.executeQuery(sql); の時点でエラーとなります。 Statement st = cn.createStatement(); まで正常に動作するのは確認済みです。 類似する質問に http://oshiete1.goo.ne.jp/qa3522131.html がありましたが、解決できませんでした。 どこが間違っていますでしょうか。