2016-12-08 3 views
0

私は辞書アプリケーションを開発しており、多くの外部ソースを使用してデータを収集しています。 このデータは、これらのソースから初めて収集されたものです。その後、そのデータをデータベースに保存し、そのデータベースからフェッチします。データベースはバックグラウンドで保持されます

私が直面している問題は、セット、カット、プットなどのいくつかの単語は100の意味と多くの例を持っています。このデータをすべてmysqlに永続させるには約10秒かかります。私はmybatisを使ってデータを保持しています。そしてそのために、応答時間が急上昇しています。このデータベースがなければ、ソースからフェッチした直後にデータを表示すると400-500msの応答が得られます。

私はバックグラウンドでデータを保持する方法を見つけようとしています。私はMVCパターンを使用しているので、DAOレイヤーは別です。

ダオ層のスレッディングを解決策として使用することをお勧めしますか?あるいは、カフカのようなメッセージングツールを使用して、指定された単語をバックグラウンドで保持するメッセージを送信する必要がありますか?他に何ができますか?

注:今はdbとしてMySQLを使用していますが、後でキャッシュするためにはおそらくredisを使用します。質問+さらにコメントの

+2

データをMySQLに保存するのに10秒かかることは、あなたのhddのI/Oを効率的に使用していないことを意味します。挿入クエリをトランザクションブロックで囲みます。あなたはキャッシングのためにredisを必要としませんが、MySQLは適切に使用されると非常に高速です(人々はちょっと悲しいことにそれをやる方法も手がかりもありません)。あなたのインサートは十分に速くなければなりません。 'InnoDB'エンジンの使用に注意してください。あなたの' innodb_buffer_pool_size'変数は十分に高いので、MySQLはあなたのHDDをすべて使用する必要はありません。 – Mjh

+0

実際にそれらの複数の要求を次々に実行しています。つまり、100個の挿入クエリに似ています。また、ロギングには時間がかかりますが、ロギングを無効にしても、すぐに持続するとは思われません。ありがとう。私はinnodbのバッファサイズを増やし、トランザクションブロックを使用して結果を知ってもらいます –

+0

このように100のクエリを1回のトランザクションでラップします。 100のI/Oの代わりに1を使うでしょう。それはそれを速くします。 – Mjh

答えて

0

私の世界の答え:

はMyBatisのforeachので一括挿入をしないでください。代わりに、ExecutorTypeReuseまたはBatchRead the documentation)を使用して、ストアするオブジェクトのリストに対してJava反復でステートメントを実行する必要があります。取引について

、メインMyBatisの-config設定のXMLでは、環境設定:session = sessionFactory.openSession(); session.commit(); session.rollback();

  • のTransactionManagerタイプがにをマネージコードでトランザクションを管理するために

    • のTransactionManagerタイプJDBCをコンテナを管理させてください。

    さらに、新しいスレッドにデータを保存する時間がかかる間に、Webアプリケーションに応答を送信させることができます。

  • 関連する問題