2009-06-30 56 views
4

私はJavaコードとMySQLデータベースとの接続が非常に遅いという問題があります。私はボトルネックがどこにあるのか分からない。MySQLとJDBCが本当に遅い、わからない理由

私のプログラムは多かれ少なかれチャットボットです。ユーザーが何かを入力すると、私のプログラムはその文を単語に分割し、単語ごとに単語をデータベースに送ります。そこに何かが見つかると、ユーザーは出力を取得します。 データベースは外部サーバーにありますが、私の隣にあるpcにも接続しようとしました。どちらも遅いです。

私は通常、どこにいても正常に動作する場所で接続を試みました。その場所では、ほとんどの場合、高速でした。

マイSQLコード:LCASE(sch.SCHLUESSELWORT)LIKE ' "+入力+" %' AND info.ID_INFO = sch.ID_INFO情報INFO FROM

SELECT info.INFORMATION、INFO_SCHLUESSELのSCH

注文BY info.PRIORITAET DESC LIMIT 1;

(ちょうどそれがSQLコードを理解するのに役立ちます場合は、思い出した:
schluessel =キー
Schluesselwortを=キーワード
prioritaet =優先)

私のJavaデータベース・コードは、多かれ少なかれ標準のものです:

文字列ドライバ= "com.mysql.jdbc.Driver";
文字列dbase = "jdbc:mysql:// bla";
文字列dbuser = "bla";
文字列dbpw = "bla";

Class.forName(driver);
接続con = DriverManager.getConnection(dbase、dbuser、dbpw);
ステートメントstmt = con.createStatement();

ResultSet rs = stmt.executeQuery(query);
(rs.next())
{
ergebnis = rs.getString( "info.INFORMATION");
}

rs.close();
stmt.close();
con.close();

編集:

私は今、しばらくの間、このDBCPを試してみました、と私はそれが仕事を得るように見えることはできません。それは古い接続ほど遅いようです。これは私が使用するウェブサイトによって提供される例です:

GenericObjectPool connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( "jdbc:mysql:// bla"、 "bla"、 "bla");
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory、connectionPool、null、null、false、true);
PoolingDriverドライバ=新しいPoolingDriver();
driver.registerPool( "example"、connectionPool);
接続conn = DriverManager.getConnection( "jdbc:apache:commons:dbcp:example");

+0

接続プールを使用していますか? – Thilo

+0

いいえ、まだありません。しかし、私は今それを調べます。 –

答えて

6

私はそれが問題を引き起こしている接続設定だと思う。これはかかる時間タイミング価値があるだろう:

Connection con = DriverManager.getConnection(dbase, dbuser, dbpw); 

をし、もしそうなら、あなたはデータベース接続をプールすることを可能にする、Apache Commons DBCPをチェックしてください。

+0

ええ、それは問題のようです...これだけで約2秒かかります。私はあなたのリンクを読むでしょう。 –

+0

優秀(あなたが問題を発見した)プールは接続をセットアップして維持し、接続時間のオーバーヘッドなしにオンデマンドでそれらを引き渡します。 –

+0

私はそれを試しましたが、うまく動作しないようです。元の投稿に編集した接続プールのコードを見ることができますか? –

0

これはデザインに関する議論を保証するものだと思います。パフォーマンスを向上させるためにできることはいくつかあります。あなたはここで何かを永続化していないので、いくつかのカスタムJavaオブジェクト、マップ、リストなどのメモリ内のすべてのデータをプリロードしてから、そのワードのメモリ内参照を実行して結果を得る方が良いです。別のアプローチは、バッチステートメントを使用して、各単語の接続を作成して解放しないようにすることです。ああ、バッチステートメントを使用する場合は、バッチサイズを適切な数値、好ましくは素数に設定してください。

+1

すべてのデータを事前にロードしていますか?これは小さなデータベースでは可能かもしれませんが、データベースが大きければ大きいほど、ユーザーはインターネット経由で読み込む必要があります。それは検索の方が速いかもしれませんが、コンピュータに必要なすべてのデータがあるまでは、以前の方法よりも時間がかかりました。 –

+0

基本的に、設計では、なぜワードベースのデータをリレーショナルデータベースに格納しているのかという要件が保証されています。あなたが永続性のためにそれをやっているなら、私は解決策が理にかなっていないと思います。より良い方法は、ファイルベースで、インデックス作成と検索にIRライブラリを使用することです。 – user121803

+0

おそらくそれはより良いapprochだろうが、私は何とか私から聞いたことをやってうれしかった。ファイルベースのシステムもポーズシビルであることは決してありません。おそらく次回は...これは単なるプロトタイプです。どういうわけか、それは完璧ではない場合、大きな問題ではない仕事をしなければならない。 –

関連する問題