メモリリーク(?)時にSQLException

このQ&Aのポイント
  • java+mysqlでWebアプリを作成中ですが、DBからデータ取得後にSQLExceptionが発生します。
  • 取得結果をStringに格納するときにエラーが発生しており、ResultSetがクローズされているというエラーメッセージが表示されます。
  • メモリリークが発生しているのかもしれませんが、エラーが2回に1回だけ発生する点が謎です。javaやjdbcのバグの可能性も考えられます。
回答を見る
  • ベストアンサー

メモリリーク(?)時にSQLException

メモリリーク(?)時にSQLException 初めて質問させていただきます。 java+mysqlでWebアプリを作成しているのですが、DBからデータ取得後、取得結果をStringに格納するところで2回に1回だけエラーとなってしまいます。 具体的には下記のようなプログラム実行時にSQLExceptionが出てしまいます。 // ---- プログラム // ・・・(略)・・・ String str = ""; rs = pst.executeQuery(); while (rs.next())} str = str + rs.getString("name"); } // ---- 出力されるエラー(途中まで) java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:644) at com.mysql.jdbc.ResultSet.next(ResultSet.java:6663) ResultSetがクローズされてるよというエラーだと思うのですが、 str = str + rs.getString("name"); のところを str = rs.getString("name"); に書き換えた場合と、String型ではなくStringBufferでappendを使って文字列連結させていった場合はエラーになりません。 また、ログを入れて動作状況を確認してみたところwhile文は何回かは動いているようです。 ※while文は5000回以上ループし、strは最終的にかなり大きいサイズになります。 このような状況を考えると、メモリリークが発生して落ちているのかと思うのですが、発生しているエラー内容は上記の通りSQLExceptionです。 また、一番腑に落ちないのはこのエラーが2回に1回だけ出る、ということです。 同じような現象をご存知の方がいらっしゃいましたら、何が起こっているのか教えていただけないでしょうか? 未熟ながら私の予想ですと、メモリリークが発生する前にjavaがGCでメモリクリアしようとしているんだけど、そのときにResultSetも一緒に消しちゃってる・・・? javaやjdbcのバグ???とも考えているのですが、どうやって確認したらいいのかわからず困っています。

  • Java
  • 回答数5
  • ありがとう数2

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

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

java のgcがResultSetを消しちゃうと言う様な話は、聞いた事がありませんが、 ResultSet自体が、時間切れや、過負荷時に、自動的にクローズされると言う 事なら、ありえるかと思います。 ResultSet自体の実装として、TCP/IP等による、ソケット接続を内部的に行っ ている可能性がありますからねぇ。

mastema01
質問者

お礼

>ResultSet自体が、時間切れや、過負荷時に、自動的にクローズされると言う >事なら、ありえるかと思います。 なるほど。 1/2の確立でしかエラー発生しないことを考えると可能性としては低い気もしますが、その線で調べてみます。ありがとうございます!

その他の回答 (4)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.5

> 変数rsは使う前に毎回初期化していますので、問題ないかと思います。 どう初期化しているのかわからないけど 「~思います」がついているうちは疑ってかかるわよ。 私はResultSetの使い方を疑っているわ。 closeされた後のResultSetに対し何かやっているんじゃないか、ってね。 そのひとつが変数rsの再利用だったわけ。 もう一度、なにか思い込みでやっているところがないか 見直してみるべきよ。

  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.4

PreparedStatementを使い回ししている可能性はありませんか? 参考URLより: デフォルトでは、Statement オブジェクトごとに 1 つの ResultSet オブジェクトだけが同時にオープンできます。 rsやpstがスレッドセーフでは無いのに、他のスレッドから(他のリクエストから)サーブレットが呼ばれていませんか?

参考URL:
http://java.sun.com/javase/ja/6/docs/ja/api/java/sql/Statement.html
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

このコードだけじゃわからないけど 他の回答者とは別の視点から仮説。 変数rsを同じスレッド内で再利用していない?

mastema01
質問者

お礼

変数rsは使う前に毎回初期化していますので、問題ないかと思います。 回答ありがとうございます。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

>while (rs.next()) rsはResultSetクラスですかね。java.sql のクラスは使ったことがないけど、 Iteratorを実装しているなら、次が有るかどうかは、hasnext() でチェックして、 次があれば、ifブロック内で next() でobject を得て作業という手順のはず。 次があるかのチェックもしないで、next() を繰り返せば、当然いつかは、「データを得られなかった → Operation not allowed after ResultSet closed」というエラーになる。

mastema01
質問者

補足

回答ありがとうございます。 また、説明不足で申し訳ありません。ご指摘の通り、rsはResultSetです。 しかし、ResultSetはnext()で次が無かったらfalseを返すので、 >while (rs.next()) は問題ないかと思います。 ご指摘にあるように「いつか必ずエラーになる」のではなく、2回に1回のみエラーになっています。

関連するQ&A

  • eclipse 追加表示

    eclipseでメンテナンスを作ってるんですが追加ができないんです ボタンを押したらこんなのがでてきたんですがどうしてでしょうか eclipse 3.2,tomcat6,mysql javax.servlet.ServletException: java.sql.SQLException: Incorrect integer value: 'null' for column 'id' at row 1 tuika1.doPost(tuika1.java:111) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 原因 java.sql.SQLException: Incorrect integer value: 'null' for column 'id' at row 1 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3376) com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3308) com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837) com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961) com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2537) com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564) com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485) tuika1.doPost(tuika1.java:75) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

  • MySQLを利用したサーブレットの実行時のエラーについて。

    ローカルマシンにMySQLをインストールし、サーブレットでアクセスするプログラムを作っています。MySQLの動作は確認済みです。 MySQLのPATHとJDBCドライバのCLATHPASSの設定もしました。サーブレットのソースはWEB上のサンプルをそのまま利用しています。 DBの設定部分のソース↓ Class.forName("org.gjt.mm.mysql.Driver"); Connection con = DriverManager.getConnection"jdbc:mysql:///hellodb"); PATH↓ C:\Program Files\mysql\bin CLATHPASS↓ C:\j2sdk1.4.0\jre\lib\ext\mysql-connector-java-3.0.2-beta-bin.jar エラー内容は以下の通りです。 --------------------------------------------------------------------- java.sql.SQLException: Column 'NO' not found. at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:2862) at com.mysql.jdbc.ResultSet.getInt(ResultSet.java:1338) at HelloWorldJDBCMySQL.main(HelloWorldJDBCMySQL.java:24) --------------------------------------------------------------------- DBへアクセスできていないと思うのですが、自分で調べた限りでは前述の設定以外の方法が調べきれませんでした。 お力添えお願いいたします。

  • eclipseからDBへの接続

    java:1.6.0_1、mysql:5.1、eclipse:3.5、jdbc:mysql-connector-java-5.1.10-bin.jarです。 エラーが MYSQLエラーコード:0 エラーメッセージ:Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. SQLStateコード:08S01 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2214) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:781) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:352) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:284) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at chap2.DBConnect.main(DBConnect.java:13) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:343) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2137) ... 12 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:525) at java.net.Socket.connect(Socket.java:475) at java.net.Socket.<init>(Socket.java:372) at java.net.Socket.<init>(Socket.java:215) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:292) ... 13 more 初心者でなにがだめか調べてもわかりません。 どなたかご指導おねがいします

  • JDBCに初めて挑戦しようとしたのですが。

    「JAVA+MySQL+Tomcatで始めるWebアプリケーション開発入門」という本でJDBCに初めて挑戦しようとしたのですが、下記のようなエラーが出てうまく実行できませんでした。 java.sql.SQLException: Access denied for user: 'Mulder@localhost' (Using passwor d: YES) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:771) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1229) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2558) at com.mysql.jdbc.Connection.<init>(Connection.java:1485) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :266) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at JdbcTest.main(JdbcTest.java:12) Exception in thread "main" java.lang.NullPointerException at JdbcTest.main(JdbcTest.java:24) 原因など、わかる方がいたら教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Column '' not found.

    jspファイルを実行するとカラムが見つかりませんというエラーが出ました。 対象のテーブルにoniカラムは置いてあります。 どこを見直せば良いのでしょうか?よろしくお願いします。 java.sql.SQLException: Column 'oni' not found. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1167) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2851) at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275) at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275) at suika.SuikaDAO.findKeisanByID(SuikaDAO.java:134) at suika.SuikaServlet.doPost(SuikaServlet.java:39) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722)

    • ベストアンサー
    • MySQL
  • MySQL と JDBCで・・・

    質問させてください。 windows98に ・j2sdk-1_4_1_07-windows-i586.exe ・mysql-4.0.25-win32.zip ・mysql-connector-java-3.1.10.zip をダウンロードしました。 環境変数を設定し javaソースコードを作成しました。 コンパイルは出来たのですが、実行すると コマンドプロンプトに java.sql.SQLException: Access denied for user: '@localhost' to database 'hellodb ' at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2921) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:770) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1228) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2544) at com.mysql.jdbc.Connection.<init>(Connection.java:1474) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :264) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:193) at HelloWorldJDBCMySQL.main(HelloWorldJDBCMySQL.java:15) と表示されてしまいます。 過去ログを見させていただきましたが自分の求める回答を見つけきれませんでした。 どなたかご教授のほど、よろしくお願いします。

  • MySQLへ途中から接続できなくなる

    MySQL 5.5.27, mysql-connector-java 5.1.12を用いて,MySQLにアクセスしています. しばらくは動いているのですが,時間が経つと,以下のようなエラーを吐いて止まってしまいます. 関連するコードは以下の通りです. https://gist.github.com/4243576 どなたか解決法が分かる方がいらっしゃいましたら,よろしくお願い致します. ----以下エラーコードです (行数はコードと対応しておりません. エラーコードの39行目に当たるのがgistの35行目, 287行目に当たるのがgistの46行目 291行目に当たるのがgistの50行目 になります.) com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link fai lure The last packet sent successfully to the server was 0 milliseconds ago. The driv er has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 122) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49) at sun.reflect.GeneratedConstructorAccessor10.newInstance(Unknown Source ) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :285) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at botan.DBManager.connect(DBManager.java:39) at botan.DBManager.insertStatusIdsLong(DBManager.java:287) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communicatio ns link failure The last packet sent successfully to the server was 0 milliseconds ago. The driv er has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 122) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181) ... 16 more Caused by: java.net.SocketException: No buffer space available (maximum connecti ons reached?): connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:256) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293) ... 17 more Exception in thread "main" java.lang.NullPointerException at botan.DBManager.insertStatusIdsLong(DBManager.java:291)

  • MySQLでJDBC接続をTomcatで接続できないです。。。。

    JDBC接続を現在勉強しています。 そこで、eclipseの中にTomcatをプラグインして、javaからデータベースに接続を心みているのですが、エラーが出て自分なりにいろいろ試したのですが、どうしてもエラーが消えません。 ご指摘いただけたらと思います。 エラー内容 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 環境内容 windows xp professional Eclipse 3.3 (C:\eclipse) Tomcat 5.5 (C:\eclipse\servers\tomcat-5.5) java (C:\Program Files\Java\jdk1.6.0_06) MySQL (D:\mysql-5.0.67-win32 データベースはDドライブにおいています) JDBCドライバー mysql-connector-java-5.1.6-bin.jar(C:\eclipse\servers\tomcat-5.5\common\libの配下に設定) PATHの設定 CLASSPATH C:\eclipse\servers\tomcat-5.5\common\lib javaのソースコード import java.sql.*; public class JdbcMySQLTest { public static void main(String[] args) { try { // ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver"); // MySQLの場合 // データベースへ接続 String url = "jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS"; Connection con = DriverManager.getConnection(url); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM HELLO_WORLD_TABLE"; // クエリーを実行して結果セットを取得 ResultSet rs = stmt.executeQuery(sql); // 検索された行数分ループ while (rs.next()) { // NOを取得 int no = rs.getInt("NO"); // 言語を取得 String lang = rs.getString("LANGUAGE"); // メッセージを取得 String msg = rs.getString("MESSAGE"); // 表示 System.out.println(no + " " + lang + " " + msg); } // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } 上記コードをEclipseから実行しますとコンソール上に java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at jp.co.Beas.JdbcMySQLTest.main(JdbcMySQLTest.java:11) になってしまいます。 JdbcMySQLTest.java:11からcom.mysql.jdbc.Driverが ないですよ~といっているのは理解しているのですが そこでいろいろドライバーの配置などを変更したのですが エラーがやはりかわりません。 ながながとなって申し訳ございませんが、ご教授いただけたらと思います。

  • jspのプログラムについて

    jspファイルで データベースの中のテーブルの中身をCSVファイルに出力するプログラムを教えてください。 delete文で中身を消すプログラムは書けたのですが、これはできません。 conn = null; st=null; conn=DriverManager.getConnection("jdbc:mysql://localhost/データベース名?" + "user=ユーザー名&password=パスワード&useUnicode=true&characterEncoding=utf8"); st=conn.createStatement(); StringBuffer buf = new StringBuffer(); buf.append("delete from where id="+id); st.executeUpdate(buf.toString()); これで削除はできました。 なのでbuf.appendの中身を buf.appendbuf.append("select * from テーブル名 INTO OUTFILE \"data.csv\" fields terminated by ',' "); これに書き換えればできると思ったのですができません。 よろしくお願いします。 エラー内容は org.apache.jasper.JasperException: An exception occurred processing JSP page /CSV.jsp at line 24 21: 22: StringBuffer buf = new StringBuffer(); 23: buf.append("select * from anpisystem INTO OUTFILE \"data.csv\" fields terminated by ',' "); 24: st.executeUpdate(buf.toString()); 25: 26: } 27: Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:401) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 原因 javax.servlet.ServletException: java.sql.SQLException: Can not issue SELECT via executeUpdate(). org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791) org.apache.jsp.CSV_jsp._jspService(CSV_jsp.java:94) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 原因 java.sql.SQLException: Can not issue SELECT via executeUpdate(). com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1803) com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1764) org.apache.jsp.CSV_jsp._jspService(CSV_jsp.java:76) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

    • ベストアンサー
    • Java
  • getStringの値がNULLの時の処理

    DB:SQL Server 2005 JDBCを使ってデータベースへアクセスし、SQL発行して結果をResultsetに格納、getStringで各項目の値を取得するところまでは確認できています。 外部結合したテーブルを参照していおり、getString()でnullを取得した場合にjava.lang.NullPointerExceptionが返ってエラーとなってしまいます。 回避策はあるのでしょうか? 抜粋したソースを下記に記します。 -- test.jsp -- <% ResultSet rs = db.executeQuery(sql); while(rs.next()){ String disp_object = rs.getString("object"); if(disp_object == null) disp_object="---"; } %> <tr>Object</tr> <tr><%=disp_object%></tr>

    • ベストアンサー
    • Java

専門家に質問してみよう