DB接続エラーが発生していますか?原因と回避方法を教えてください。

このQ&Aのポイント
  • Servletで画像データベースを構築し、DBへの接続エラーが発生しています。
  • ブラウザーの画面でDBから取り出した値は全てnullで表示されています。
  • TomcatからJDBC経由でPostgresに接続が出来ていない可能性があり、原因と回避方法を知りたいです。
回答を見る
  • ベストアンサー

DB接続エラー

Servletで画像データベースを構築しました。 画像データベースといいましても、画像そのものはファイルとして任意のディレクトリに保存し、その画像名や画像情報などをデータベースで管理しています。 それを管理しているときに、DBへの接続エラーが発生しているようなのです。 曖昧な言い方ですいませんが、頻繁に発生するわけではないので(ここ1年で2度)何がどうなっているのかよく分からないのです。 状況は、管理しているとき(データベースへは書き込みと読み込みが連続して行われます。)にのみ問題が発生しています。 ブラウザーの画面でDBから取り出した値は全てnullで表示されています。 ブラウザーの画面が表示されていますので、Tomcatが落ちていることはありません。 シェルからPostgresを操作してみましたが問題なく動作しています。 TomcatからJDBC経由でPostgresに接続が出来ていないのだろうと思うのですが、 どう言った原因でこう言うことになるのでしょうか?また、回避方法はあるのでしょうか? よろしくお願いします。 TurboLinux8 server Postgres7.2.4 Tomcat4.1.30 TomcatとPostgresへはデータソースは使っていません。

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

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

  • ベストアンサー
  • yusukey
  • ベストアンサー率56% (17/30)
回答No.4

OutOfMemoryError についてフォロー。もしOutOfMemoryError がでている場合、可能であればヒープサイズを増やしましょう。 -Xmx512m とかいうオプションが起動スクリプトにあるかと思います。この512の部分がヒープサイズ(Javaの作業領域みたいなの)になります。 ちょっとやそっと増やしてもおっつかないくらいであればアプリケーションの処理内容を見直す必要があるかもしれません。 画像処理というのはヒープをたんまりつかいますから。 あまりにも大きな画像は扱わないようにするとか、そもそもその処理をしないようにするとか。

OhMabu
質問者

お礼

そのようです。 JDBCのメモリを先に喰っていたようで、まず接続が出来なくなっていたようです。その段階で、こちらに通知がくるようにしていたので、なせDBがとなってしまっていました。 どうも、ありがとうございました。

その他の回答 (4)

回答No.5

コネクションの制限はどうなっていますでしょうか? 一度DBサーバーのコネクション制限数を上げて見て様子を見てはいかがでしょうか? コードが無いのでなんともいえませんが、ひとつの処理中に大量のコネクションを張っていませんか? もしくは、開放を忘れていませんか? OhMabuさんがテストする際にはどういうテストをなさっているのでしょうか? 動作確認だけでなく長時間の負荷テスト(同時接続)などを行って実働状況に近づけてみましたか? たまに起きるということは処理集中時のコネクションの枯渇による影響だと思われます。

  • yusukey
  • ベストアンサー率56% (17/30)
回答No.3

画像処理を加えた後に発生しているかも、とのことですからもしかするとTomcat側のヒープ領域が足りなくなっているのかもしれませんね。まずはログを確認しましょう。 ログに OutOfMemoryError など記録されていませんか? これが発生しては正常な動作は期待できません。 ヒープ領域の使用状況を確認するには -verbose:gc オプションをつけます。するとガベージコレクションが発生するたびに空き領域などが標準出力に記録されます。 侍などを使えば使用状況の遷移をグラフ化して確認することができます。

参考URL:
http://yusuke.homeip.net/samurai/
  • yusukey
  • ベストアンサー率56% (17/30)
回答No.2

正常に動作しないとき、まずDBへの接続があるかどうか確認しましょう。 netstat -an で接続状況を確認できます。デフォルトのままならば5432番への接続が確立(ESTABLISHED)しているいことが確認できるでしょう。 ↓こんなかんじで -- tcp4 0 0 127.0.0.1.51080 127.0.0.1.5432 ESTABLISHED -- 接続がなければTomcat側のデータソースの設定などを確認してください。 接続しているのに動作がおかしいということならばなんらかの予期せぬ例外が発生しているかのうせいがあります。不正なSQLを発行して例外が発生して適切に値を取得できていないのではないでしょうか。 ログを確認して、それらしき形跡がなければ例外を握りつぶしている可能性があります。 try{ //DBへの接続、SQL発行など }catch(SQLException(またはException) sqle){} といったコーディングはありませんか? この場合なんらかの問題が発生しても確認できませんので適切にスタックトレースを表示するなりフォローの処理を加えるなりしましょう。

OhMabu
質問者

補足

結果的にDBへの接続が出来なくなっているようです。 ただ、1年ほど動かしていて2度この状況になりましたが、私の方(私の操作中)では、正常に動作しており、再現性がなくて困っています。 トンチンカンなことかもしれませんが、postgresのプロセスがなんらかの原因で立ったままになり、メモリを圧迫しているのかな?とかも疑っています。 デバック中はプロセスビューワーなるものを立ち上げながら、各プロセスを監視しながら行ったりもしているのですが、どうも原因がつかめないんです。 一つ気になっているのは、最初は画像のサイズ合わせを各クライアント側で行っていたのですが、途中からImageIOを使用して、サーバー側で行うようにしました。どうも、それ以降、問題が発生しているように思います。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

Servletでログを取ってないの? ブラウザ画面だけ見てデバッグなんて無謀でしょ。

OhMabu
質問者

補足

ありがとうございます。 >ブラウザ画面だけ見てデバッグなんて無謀でしょ。 はい、でも、状況として書いているだけで、そのようなことをしているなんて一文もかいていませんので。もし、質問が言葉たらずならごめんなさい。

関連するQ&A

  • AppletからDB接続について

    いつもお世話になっております。 現在、Appletから直接、DB(Oracle9.2)に接続するPGを作っています。 しかし、appletviewerだと、表示できるのですが、dbサーバに置いて、クライアントからブラウザで表示しようとすると、以下のエラーが発生してしまいます。 「access denied(java.util.PropertyPermission oracle.jserver.version read)」 Appletではセキュリティの関係で、DB接続などができないと聞きますが、それが原因なのでしょうか? 環境ですが、 Java:J2SDK1.4.09、 DB:Oracle9.2、 JDBC:ojdbc14.jar を使っています。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • DBに接続ができません!!

    OSがリナックスで asianuxをつかってます プログラムをブラウザ上で表示すると DBへの接続のプログラムは DB errorとなり 表示できません。 データベース テーブルは作成してあり アパッチ mysqlも起動してます。 なぜでしょうか・・教えてください!!

  • アプレットでのDB接続の行い方

    JAVAアプレットでAccessのDBに接続して値を取得し、その値をブラウザ上に表示するプログラムを作っています。ソースコードをコンパイルしブラウザ(IE6.0)に表示させようとすると、 Exception:java.security.AccessControlException: access denied(java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc) という文がブラウザ上に表示され、値が表示されません。なにかJAVAのセキリティにひっかかっていると思われるのですが、どんな方法ならDBから値を取って表示させられるのでしょうか。

    • ベストアンサー
    • Java
  • JAVA ServletでSQL Serverに接続できないんですが。

    マイクロソフトのサイト(SQL SERVER2000 Driver for JDBC)から ドライバーを取ってきて、JAVAからDB接続テストを行っています。 最初に簡単なJAVAアプリを作って実行したところ、うまく動作しました。その後、Servletで同様のtestをしたところ、Tomcatのコンソール画面に、ClassNotFoundExceptionが出て、実行できません。 下記の命令が、処理できないようです。 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); CLASSPATHの設定もコマンドプロンプトで、setコマンド実行結果で確認済みです。 他のデータベース(MySQL)では、Servlet,JSP,JAVAアプリすべて、うまく実行できました。 ご存知の方、よろしくお願いいたします。 環境:(1台のマシン内での仮想ネットワーク) windows XP Pro (SP1) j2SDK 1.4.1_03 Tomcat4.1 SQL Server2000

  • 「DB接続障害」とは

     こんばんは  先日は、多くのご回答をいただき、ありがとうございました。  さて、今回の質問ですが、先ほど、ある掲示板サイトに書き込みを行った後、「書き込む」のボタンをクリックした際、また例の「ページを表示できません」の画面になり、元の掲示板サイトに戻ろうと、ブラウザ左上の「戻る」ボタンをクリックしたところ「エラーです、D901:DB接続障害が発生しました」という、聞きなれないメッセージ画面が出ました。  ただこのメッセージと、「戻る」というボタンだけの、ほとんど真っ白の画面です。  そこでお尋ねしますが 1、「DB接続障害」とは、どういう障害なのでしょうか 2、この障害が発生する原因、対処法を教えてください。

  • サーブレットからJavaBeansを利用したDB接続について

    初歩的な質問ですみません。 下記環境で、Javaを勉強しています。 教材 :やさしいJava 活用編 Lesson8 Sample5 実行環境:j2sdk1.4.1_07 (教材では、j2sdk-1_4_0) Tomcat 5.0(教材では、Tomcat-3.2.3) IE6.0 サーブレットでリクエストを受付け、JavaBean経由でDBに接続(Access2000を利用)しDBの中身をJSPで表示するいう流れです。サーブレットのURLを指定して実行してもjspページには何も表示されません。 ログファイルには下記エラーが記述されています。 勘違いか、何らかの初歩的なミスだと思いますが、解決方法が見つかりません。解決方法をご存知の方教えて下さい。よろしくお願いします。 尚、JDBC-ODBCドライバを使用していますが、サーブレットからではなくJavaアプリからではAccess2000のDB参照更新が出来ています。サーブレットから(JavaBean経由)だとうまくいかないという事象です。 java.sql.SQLException: [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバが見つかりません。 at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6879) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7036) at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3028) at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323) at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:171) at CarDB.CarDBBean.<init>(CarDBBean.java:22) at Sample5.doGet(Sample5.java:16) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at ~略~

  • tomcatからのoracle接続エラーについて

    お世話になります。 javaサーブレットからoracleに接続する際、以下のエラーが発生して困っております。 エラー:java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver 解決するための情報を頂けますでしょうか。 私がテストしている環境は、以下となります。 【Webサーバ】 centOS5.5. jdk1.6 tomcat5.5 【DBサーバ】 centOS5.5. oracle11g r2 jdbcドライバーは、ojdbc6.jarを使用しております。 ドライバーは、Webサーバの /WEB-INF/libと$TOMCAT_HOME/common/lib配下に設置しております。 環境変数クラスパスに$TOMCAT_HOME/common/libが、設定されていることも確認しております。 JDBCドライバについては、以下の3パターンで試してみましたがすべて同じエラーとなりました。  ・オラクルインストール時のもの(DBサーバ)  ・オラクルHPの11g r2(11.2.0.1)のもの  ・オラクルHPの11g r2(11.2.0.2)のもの どのJDBCドライバを配置した時も、cataline.outには、 oracle.jdbc.OracleDriverクラスが、追加できたというログが出力されておりました。 尚、同じWebサーバでpostgresqlに接続するjavaサーブレットは、/WEB-INF/lib 配下にJDBCドライバーを配置しているだけで問題なく動作しております。 お手数お掛け致しますが、ご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • DB接続しようと思ったら下記のようなエラー

    JSPでDB接続するページを作成してアクセスしたら下記のようなエラー出てしまいました。解決策をお願いします。 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 org.apache.jasper.JasperException: javax.servlet.ServletException: javax.naming.NameNotFoundException: 名前 jdbc はこのコンテキストにバインドされていません org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491) 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) day10.LogFilter.doFilter(LogFilter.java:46) 原因 javax.servlet.ServletException: javax.naming.NameNotFoundException: 名前 jdbc はこのコンテキストにバインドされていません org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791) org.apache.jsp.day06.insert2_jsp._jspService(insert2_jsp.java:81) 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) day10.LogFilter.doFilter(LogFilter.java:46) 原因 javax.naming.NameNotFoundException: 名前 jdbc はこのコンテキストにバインドされていません org.apache.naming.NamingContext.lookup(NamingContext.java:770) 略 org.apache.naming.NamingContext.lookup(NamingContext.java:153) org.apache.naming.SelectorContext.looku

    • ベストアンサー
    • Java
  • tomcat起動時エラー

    tomcatを起動すると以下のようなエラーがでてしまい、どこを修正すればよいかわからず困っています。どなたかわかる方がいらっしゃれば教えていただきたいです。 javaの勉強をしている初心者です。 [コンソールに出力されるエラー内容] 致命的: キー UserDatabase でユーザデータベースを検索中の例外です javax.naming.NameNotFoundException: 名前 UserDatabase はこのコンテキストにバインドされていません 補足:jdbcドライバーを利用してデータベースと接続をしようとしているところです。 開発環境:windows7、eclipse3.7、tomcat7.0、servlet3.0、mysql5.5

  • PHPのPEARでDBに接続していますが、、

    フリーで提供しているサーバ @PAGES を ご利用の方がいましたら教えてください。 データベースに接続すると、 画面に何も表示されません。。 理由はなぜでしょうか? @PAGESからの データベース(mysql)利用情報 データベースホスト名は、localhost データベース名は、db0osa データベースの接続ユーザ名は、osa パスワードは、a3356df25 私は、下記のように設定しています。 dbConn=DB::connect("mysql://osa:a3356df25@localhost/db0osa"); 初心者な質問ですいません。 よろしくお願いいたします。

専門家に質問してみよう