2016-11-18 18 views
0

私は、データの読み取りと更新、およびDBアクセス用のSpring、Spring JDBCを使用するWebサービスを提供しています。私のコントローラには、デスクトップ、モバイルなどの多くのチャネルからアクセスできます。デスクトップを使用してデータを更新する場合は、モバイルに即座に反映する必要があります。現在のアプローチは、更新されたデータを得るためにサービスを継続的に呼び出すことです。私はそれが最悪のアプローチであり、DBパフォーマンスの問題も引き起こしていると感じています。Springを使用したデータベースポーリングを避けるための最良の方法

GETサービスは、連続ポーリングではなく他のチャネルによるDB更新がある場合にのみ呼び出されるような方法がありますか?これに最も適した方法とそれを実装する方法は何ですか?

+0

データベースはデスクトップ/モバイルクライアントだけで更新できますが、データを変更するバックエンドプロセスもありますか? – Insac

答えて

1

サービスを継続的に呼び出すことは、本当に悪い考えです。私は行が挿入/更新/削除されたときに起動するデータベーストリガーが必要だと思います。 Webサービスに何かをPOSTするか、メッセージキューに何かを置くことができます。

幸運。

+0

私はSpringを使って実装/アプローチを探しています。ありがとう – user2968937

+0

WebサービスをSpringにすることができます。 Spring Integrationまたは 'JmsTemplate'を使用してメッセージキューを処理できます。変更イベントを発生させるためにデータベースを使用せずに、あなたがしたいことをやるための良い方法はありません。 –

1

私はこの問題に対する建築的な答えを考えることができます。バネコントローラとデータベースの間のメッセージングソリューションを使用します。あなたは、2つのキュー

  • EventSinkキューが必要になりますInfactは - はdbservice別名データベースの更新を管理するサービスになります。このqueue.The加入者へのチャネルのいずれかから発信されるすべてのデータの変更要求を発行します。

  • イベントブロードキャストキュー - 変更後のデータpost db updateをこのキューにパブリッシュします。理想的には、dbserviceはdb updateと同じトランザクション内でこのパブリッシュを処理する必要があります。すべてのチャネルは、更新を受信するためにこのキューに登録できます。このアプローチを検討する

    メリットが

  • の長所を伴うだろう - このアプローチはとてもパフォーマンスとデータベースの変更からデカップリングの両方を全くデータベースサービスを含んでいません。

  • 短所 - 複雑化

0

継続的にポーリングは、あなたが想像するかもしれないほど悪いわけではありません。メッセージを要求せずにクライアントに送信するには、これを達成するためにウェブソケットなどが必要です。それがサーバーからの大きな休息ではなく、何百万と何百万という要求のようにそれほど頻繁ではないなら、私は今のところそれを残すでしょう。

しかし、これは大量の帯域幅があると話していますが、ポーリングすることは望ましくありません。クライアントが特定のイベントが発生したときに通知を受けるために加入する加入者タイプのパターンを調べたいと思うでしょう。このイベントが発生すると、サーバーはクライアントにメッセージを送信します。

このイベントの検出では、データベースをポーリングする必要はありません。データベースを変更すると、イベントが発生します。あなたがそのようなことに就いているなら、あなたはSpringのポイントカットでこれを行うかもしれません。

関連する問題