あなたは考える 電話やポータブルデバイスの実際の動作環境を考慮していないため、JDBCを使用する方が簡単で高速です。彼らはしばしばバグのあるトラフィック書き換えプロキシと非常識なファイアウォールを介して不安定な接続を持っています。彼らは通常、短期間に何桁にもわたって変化する、パケット損失率と遅延が高く変動するネットワークトランスポート層を使用しています。 TCPは、この環境では実際には優れておらず、特に長寿命の接続に苦労しています。
Webサービスの主な利点は、次のとおりです。
-
最小限の状態で接続が短命であるため、デバイスがWiFiネットワークを切り替えたり、セルラーとの間で切り替えたり、接続が一時的に失われたりしたときの状態に簡単に戻ることができます。および
-
最もひどく過酷なWebプロキシを除くすべてを通過できます
日常的に 直接JDBC接続で問題が発生します。 1つの課題は、デッド接続を確実にタイムアウトし、セッションを再確立し、古いセッションによって保持されていたロックを解放することです(サーバーは、クライアントが同時にデッドであると判断しない場合があるため)。もう1つは、パケット損失が原因で、操作が非常に遅くなり、データベーストランザクションが長時間実行され、その結果、ロック期間とトランザクションクリーンアップタスクに問題が発生します。また、太陽の下であらゆる種類の非常識で壊れたプロキシとファイアウォールに遭遇します-CONNECT
をサポートするプロキシ しかし、すべてのトラフィックがHTTPであると想定し、そうでない場合はそれを壊してしまうことが判明しました。接続が失敗したり、ハーフオープンのゾンビ状態になったりする、バグのあるステートフル接続追跡機能を備えたファイアウォール。想像できるすべてのNAT問題。キャリアは「役立つ」TCPACKを生成して遅延を減らし、パケット損失の検出とウィンドウのサイズ設定で発生する問題を気にしないでください。奇抜なポートブロッキング。など
全員 HTTPを使用する場合、それが機能することを期待できます。少なくとも、他の何よりもはるかに頻繁に機能します。これは、一般的なWebサイトがモバイルWebアプリでもREST+JSON通信スタイルを使用するようになった今では特に当てはまります。
Webサービス呼び出しをべき等と書くこともできます 一意のリクエストトークンを使用します。これにより、アプリはデータベースに対して2回アクションを実行することを恐れずに、変更リクエストを再送信できます。 べき等
を参照してください。 および
真剣に、モバイルデバイスからのJDBCは今では良いアイデアのように見えるかもしれませんが、私が考える唯一の方法は、モバイルデバイスがすべて私の直接制御下にある単一の高信頼性WiFiネットワーク上にある場合です。それでも、可能であればデータベースのパフォーマンス管理の理由でそれを避けたいと思います。 PgBouncerのようなものを使用して、サーバー側の多くのデバイス間の接続をプールできるため、接続プールは大きな問題ではありませんが、失われた接続や放棄された接続のクリーンアップは、それを機能させるために必要なtcpキープアライブトラフィックと同様に、長時間停止します。放棄された接続からのトランザクション。