web-dev-qa-db-ja.com

JDBCとWebサービスAndroid

AndroidデバイスをmySQLまたはPostgresqlに接続するために使用する方法を誰かが私のジレンマに答えることができますか?

私はどちらの方法でもエラーや問題なしにそれを行うことができ、顕著な違いはありませんが、jdbcドライバーと直接接続を使用する代わりに、誰もがWebサービスを推奨しています。

誰かがなぜいくつかの事実を説明できますか?

編集: jdbcを使用する場合の方が簡単であり、実行に必要な時間も少ないことについては触れませんでした。では、なぜWebサービスなのか、なぜそうでないのか?

24
fenix

あなたは考えます電話やポータブルデバイスの実際の動作環境を考慮していないため、JDBCを使用する方が簡単で高速です。バグの多いトラフィック書き換えプロキシと非常識なファイアウォールを介して、接続が不安定になることがよくあります。通常、ネットワークトランスポート層を使用しており、パケット損失率が高く、待ち時間が短いため、待ち時間が何桁も変化します。 TCPは、この環境では本当に素晴らしいものではなく、特に長寿命の接続に苦労しています。

Webサービスの主な利点は次のとおりです。

  • 最小限の状態で短時間の接続が可能であるため、デバイスがWiFiネットワークを切り替えたり、携帯電話との間で接続を切り替えたり、接続が一時的に失われたりしたときなどに簡単に戻ることができます。そして

  • 最も恐ろしく過酷なWebプロキシを除くすべてを通過できます

日常的に直接JDBC接続で問題が発生します。 1つの課題は、デッド接続を確実にタイムアウトにし、セッションを再確立し、古いセッションが保持していたロックを解放することです(サーバーがクライアントと同時にデッドと判断しない場合があるため)。もう1つは、パケット損失が原因で操作が非常に遅くなり、データベーストランザクションが長時間実行され、その結果、ロック期間とトランザクションのクリーンアップタスクで問題が発生することです。また、Sunの下では、あらゆる種類の非常識で壊れたプロキシとファイアウォールに出会います-CONNECTをサポートするプロキシですが、すべてのトラフィックがHTTPであると想定し、そうでない場合はそれを壊します。接続が失敗したり、ハーフオープンゾンビ状態になったりするバグの多いステートフル接続トラッキングを備えたファイアウォール。すべてのNAT想像できる問題;キャリアは「役立つ」TCP ACKを生成してレイテンシを削減します。パケット損失の検出とウィンドウのサイズ変更で発生する問題を気にしないでください。奇抜なポートブロッキングなど.

everyoneはHTTPを使用しているため、少なくとも他の何よりも頻繁に動作することが期待できます。モバイルWebアプリでも一般的なWebサイトがREST + JSON通信スタイルを使用するようになった今、これは特に当てはまります。

一意のリクエストトークンを使用して、Webサービスコールをidempotentと書くこともできます。これにより、アプリがデータベースに対してアクションを2回実行することを恐れることなく、変更リクエストを再送信できます。 idempotencedefinining idempotence を参照してください。

真剣に、モバイルデバイスからのJDBCは今では良いアイデアのように見えるかもしれませんが、モバイルデバイスがすべて、直接制御された単一の信頼性の高いWiFiネットワーク上にあるかどうかを検討する唯一の方法です。それでも、可能であれば、データベースのパフォーマンス管理の理由でそれを回避します。 PgBouncerのようなものを使用してサーバー側の多くのデバイス間で接続をプールできるため、接続プールは大きな問題ではありませんが、失われた接続と破棄された接続のクリーンアップは、動作させるために必要なtcpキープアライブトラフィックと同様に、長時間停止します放棄された接続からのトランザクション。

28
Craig Ringer

いくつかの理由が考えられます

  1. JDBC Androidドライバのサポートデータベース用。
  2. 接続プーリングさまざまなAndroid=デバイス間で監視およびキャップすることは困難です。
  3. DBからAndroidに送信される結果セットは、大量の帯域幅およびバッテリー電力を消費します。
  4. プロキシ通常は、デバイスへのHTTPアクセスを許可します。
  5. データベースをクライアントに直接公開すると、securityの影響があります。

Webサービスは、JDBC接続の上にauthentication/quality of service/authorization/conditional GETのような追加機能を提供できます。 =リクエスト/ エラー処理など。JDBCはこれらのいずれも実行できません。

6
Deepak Bala

クレイグリンガーが言ったことすべてに加えて、私は完全に同意しますが、JDBCには別の問題があります。 Androidデバイスからアクセスしたい場合は、アプリにデータベース認証情報を提供する必要があります。データベースにはパブリックアクセスが必要です。

WebServiceまたはRESTful APIを使用することは、アプリケーションを安全にするための明確な方法です。

4

別のオプションは、SymmetricDSなどのデータベース同期ツールを使用することです。

これにより、サーバーにPostgresデータベース、タブレットにSQLiteデータベースを作成できます。

SymmetricDSは、接続が利用可能な場合、HTTPを介してデータベースを同期します。もちろん、データベース全体を同期する必要はなく、関連する部分だけを同期する必要があります。

(私はSymmetricDSとは関係ありません)

0
Neil McGuigan