• 締切済み

jdbcのプロセスの処理について

ある特定のRDBがインストールされているデータベース サーバーにデータのロードを行っていた際、Webからの検索が起動され、この時には、3~5分程度経ってからブラウザにタイムアウトが帰っていました。 (データのロード中なのでテーブルはロックされていた) これは問題ではないのですが、この際Webサーバ側では jdbcのプロセスが生き残り、データベースサーバーへの アクセスを繰り返し続け、結局jdbcのプロセス自体が 増えつづけて、Webサーバ自体のリソースを使いきってしまうという現象が起こりました。 さらに、アクセス要求を受けつづけるデータベース自体も、データのロードが止まってしまいました。 この現象についてjdbcの設定等で回避する方法はないでしょうか? できれば特定のExceptionが発生してWebサーバに瞬時に帰り、なおかつプロセスもデータベースサーバーに 迷惑をを掛けずに死んでいくというのが理想的なのですがこのような回避方法は可能でしょうか? JDBCのことがわからず質問しました。 何卒よろしくお願いいたします。

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

みんなの回答

  • bo-ken
  • ベストアンサー率42% (3/7)
回答No.1

JDBCのプロセスとは、JDBCを使用しているサーブレットのスレッドと解釈します。 違っていたらごめんなさい。 DBコネクションプールを管理するクラスは用意していないのでしょうか? コネクションプールの管理とは、最大接続=100等とし、同時には100台のクライアントからしか 接続を許可しない方法です。(クライアントというと語弊がありますがとりあえず・・) このクラスはsingletonパターンで実装します。 この手法を使用すれば、最大コネクション数文しかサーブレットが起動できないように抑制できますので、 とりあえずリソースを使い切ってしまうということは防げます。 しかしこのままでは、ブラウザのタイムアウトを待つことには変わりありませんので、 >できれば特定のExceptionが発生してWebサーバに瞬時に帰り、・・・ を回避することが出来ません。 これはこのDBコネクションプールをカスタマイズすれば、 即画面にエラーを表示することも可能と思います。 カスタマイズ方法を説明するのもなんなので、この辺で失礼します。 では、頑張ってください。

参考URL:
http://javadrive.tripod.co.jp/servlet/schedule/18/
mem_masa
質問者

お礼

返事が遅れて大変申し訳ありませんでした。 丁寧にお答えいただき参考になりました。 ありがとうございました。

関連するQ&A

  • httpdのプロセスについて

    現在、mysqlのデータベースを利用して、サイトを作っています。 しかし、夜間は特にサーバーが重くアクセスしにくい状況が続いております。 プロセスを確認するとhttpdのプロセスが大量に発生しておりました。 つまりプロセスが終了してないんだと・・・。timeoutは20に設定しているのに・・・。 しかし、メモリ、load averagesもかなり低いままでサーバー自体にはかなりの余裕があるようです。 このような場合は、どこか他にも設定の問題があるのでしょうか? load averages等が上がっていれば対応が出来るのですが、サーバー自体には負荷がかかっていないようなので、回線が細いとかの問題なのかなぁとは思ったりもしております。 どなたか今回の現象から考えられる原因をご教授願えないでしょうか? どうぞよろしくお願いいたします。

  • JDBCについて

    JDBCを用いたMySQLデータベースへの接続方法について質問があります。 【現在の状況】 tomcatをインストール済み(正常に作動・・・起動した状態で、http://localhost:8080/に接続できます。) MySQLをインストール済み(正常に作動・・・データベースを作成できます。(例えば、sampleとします。)) JDBCドライバをセットアップ済み(CLASSPATHの設定も問題ありません。) しかし 作成したデータをjavaプログラムを用いて表示しようとしたところ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'sample' というエラーが出てしまいました。 データベースへのアクセスが拒否されたとあるのですが 理由がわからずに困っております。 接続は、以下のようにしています。 Class.forName("com.mysql.jdbc.Driver"); Connection cn = DriverManager.getConnection("jdbc:mysql:///cardb", "", ""); 解決策をご存知の方いらっしゃいましたら 御指導願います。

    • ベストアンサー
    • Java
  • jdbcでの行の情報の取得について

    アクセスにテーブルを作ってデータベースを作ったのですが、javaのjdbcを使ってそのテーブルの特定の列で特定の行の情報を取り出したいときはどのようにすればよいのでしょうか。 ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • "http"というプロセスは何ですか?

    CentOS4.1で、Apache2.0のウェブサーバーを使用しています。 夜中に、"top"コマンドを打つと、"http"というプロセスが走っています。 しかも、99.9%のCPU使用率で動いています。 これのせいで、夜間にも関わらずロードアベレージも1以上になっています。 アクセスはほとんどないはずなのに、CPUを大量に使用していることが気になっています。 夜間のみ動いているのも気になります。 この"http"というプロセスは何かご存知の方はいらっしゃいますでしょうか? Apacheのプロセスは"httpd"なので、上記の"http"とは別だと思っています。 lsof -p で"http"のプロセスを調べたところ、perlを使用しているらしいところまでは分かりました。 よろしくお願いいたします。

  • JDBCでaccessから取得したデータをjTableに表示させたい。

    JDBCでaccessのデータベースから取得したデータをjTableに表示させたいのですが どのようにしたらセルのデータやタイトルを入力させることができますか? またデータベースを操作したらその結果を表示させたいと考えています。どのようにすれば実現できるでしょうか? accessのデータベースには以下のように接続していました。 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb"; Connection con = DriverManager.getConnection(str, "", ""); 開発環境はNetBeansを使用しています。

  • eclipseでのJDBCについて

    eclipseのMySQLJDBCの外部接続に関して全く分からず手詰まりしているので、ご教授願いたいと思います。 プロジェクトの配下のweb.xmlにMySQLの接続情報を入力しました。一応ソースです。 web.xmlに <context-param> <param-name>jdbcDriver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> <description>JDBC Driver</description> </context-param> <context-param> <param-name>jdbcUri</param-name> <param-value>jdbc:mysql://localhost:3306/airticket?useUnicode=true&amp; characterEncoding=sjis</param-value> <description>MySQL URI</description> </context-param> <resource-ref> <res-ref-name>jdbc/MySQL_JDBC</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> を書いて、 会員登録をするクラスに、 try{ try{ //ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch(Exception ex) { } //データベースへ接続 String url = "jdbc:mysql:///airticket?useUnicode=true&characterEncoding=SJIS"; Connection con = DriverManager.getConnection(url); //ステートメントオブジェクトを生成 Statement stmt=con.createStatement(); String sql="insert into member(member_id,member_pass,family_name,first_name,birth_year,birth_month,birth_day,address,post_code,mail,"+"sex,home_tel,job) values('"+ member_id +"',"+ mempasslong +",'"+ family_name +"','"+ first_name +"',"+ birth_year +","+ birth_month +","+ birth_day +",'"+ address +"',"+ post_code +",'"+ mail +"',"+sexint+","+ home_tel +",'"+ job +"');"; int result=stmt.executeUpdate(sql);       stmt.executeBatch(); // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { message = "登録失敗しました。"; request.setAttribute("message", message); return mapping.findForward("registererror"); } message = "登録完了しました。"; request.setAttribute("message", message); return mapping.findForward("success"); } } って書いてクラスからweb.xmlを参照してデータベース接続したいんですが、エラーが出ずに困っています。そもそもクラスからweb.xmlの情報を参照するやりかたはあるのですか?教えてください

  • 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ドライバーで、同じ設定でいいのでしょうか? よろしくお願いいたします。

  • JDBC ドライバーのロードの方法について

    すみませんが、どなたか教えていただけないでしょうか。 JDBCを使ってデータベースにアクセスしようとする場合に、まずドライバーのロードが必要ですが、 1.Class.forName("ドライバー名"); 2.Class.forName("ドライバー名").newInstance(); 1の方法と2の方法の違いは何かあるのでしょうか?今まで私は1の方法を使っていたのですが、2の方法があると知り、どのようなときに使うものなのかわかりません。このようなときにはこっちを使う、というようなルールや目安などありましたら、教えていただけますでしょうか。 ちなみに私は、データベースはDB2を使っています。 ↓また、以前に似たような(?)質問も見受けられたのですが、私にはちょっと難しくて理解できませんでした… http://okweb.jp/kotaeru.php3?q=642489 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • EclipseでのJDBCドライバについて

    Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか? またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか? ご存知の方教えてください、よろしくお願いします。

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

専門家に質問してみよう