web-dev-qa-db-fra.com

JDBC vs Web Service pour Android

Quelqu'un peut-il indiquer à mon dilemme quelle méthode utiliser pour connecter Android appareil à MySQL ou Postgresql?

Je peux le faire dans les deux sens sans erreurs ni problèmes, sans différence notable, mais tout le monde recommande le service Web au lieu d'utiliser le pilote jdbc et la connexion directe.

Quelqu'un peut-il expliquer pourquoi avec quelques faits?

EDIT: Je n'ai pas mentionné que c'est plus simple et nécessite moins de temps pour le faire sur jdbc. Alors, pourquoi un service Web, ou pourquoi pas?

23
fenix

Vous pensez il est plus simple et plus rapide de le faire avec JDBC, car vous n’envisagez pas l’environnement d’exploitation réel des téléphones et des appareils portables. Ils ont souvent une connectivité instable grâce à des procurations de réécriture de trafic et à des pare-feu insensés. Ils utilisent généralement une couche de transport réseau qui présente des taux de perte de paquets élevés et variables ainsi que des latences qui varient selon de nombreux ordres de grandeur sur des périodes très courtes. TCP n'est vraiment pas génial dans cet environnement et se bat particulièrement avec des connexions de longue durée.

Le principal avantage d'un service Web est qu'il:

  • A des connexions de courte durée avec un état minimal, il est donc facile de revenir à l'endroit où vous vous trouviez lorsque l'appareil bascule les réseaux WiFi, de/vers le cellulaire, perd brièvement la connectivité, etc. et

  • Peut passer par tous les proxies Web les plus horribles et draconiens

Vous allez de manière routinière rencontrer des problèmes avec une connexion JDBC directe. Un défi consiste à contrôler de manière fiable les connexions inactives, à rétablir les sessions et à libérer les verrous détenus par l'ancienne session (car le serveur peut ne pas décider qu'il est mort en même temps que le client). Une autre cause est la perte de paquets, entraînant des opérations très lentes, des transactions de base de données de longue durée et des problèmes conséquents de durée de verrouillage et de tâches de nettoyage transactionnel. Vous rencontrerez également tous les types de proxy et de pare-feu en panne et insensés sous Sun: des proxys prenant en charge CONNECT, mais supposant que tout le trafic est en HTTP, puis le masquer s'il ne l'est pas. des pare-feu avec un suivi des connexions avec état qui posent des problèmes et provoquent l’échec de la connexion ou le passage à un état de zombie semi-ouvert; chaque NAT problème que vous pouvez imaginer; des transporteurs "généreusement" générant TCP ACK afin de réduire le temps de latence, indépendamment des problèmes liés à la découverte de la perte de paquets et au dimensionnement de la fenêtre; blocage de port farfelu; etc.

Parce que tout le monde utilise HTTP, vous pouvez vous attendre à ce que cela fonctionne - du moins, beaucoup plus souvent que toute autre chose. Cela est particulièrement vrai maintenant que les sites Web courants utilisent le style de communication REST + JSON, même dans les applications Web mobiles.

Vous pouvez également écrire vos appels de service Web sous la forme idempotent à l'aide de jetons de demande uniques. Cela permet à votre application de ré-envoyer des demandes de modification sans craindre d’exécuter une action deux fois contre la base de données. Voir idempotence et définition de idempotence .

Sérieusement, JDBC depuis un appareil mobile peut sembler une bonne idée à présent - mais la seule façon dont je considérerais cela serait que les appareils mobiles soient tous sur un seul réseau WiFi hautement fiable sous mon contrôle direct. Même dans ce cas, je l’éviterais pour des raisons de gestion des performances de la base de données, si possible. Vous pouvez utiliser quelque chose comme PgBouncer pour regrouper les connexions entre de nombreux périphériques côté serveur. Le regroupement des connexions n'est donc pas un gros problème, mais le nettoyage des connexions perdues et abandonnées l'est également, tout comme le trafic keepalive tcp nécessaire au bon fonctionnement transactions de connexions abandonnées.

28
Craig Ringer

Je peux penser à quelques raisons

  1. Support des pilotes JDBC Android pour votre base de données.
  2. La connexion la mise en commun entre différents appareils Android rend leur surveillance et leur mise en cache difficiles.
  3. Les ensembles de résultats envoyés depuis la base de données vers Android consomment énormément de bande passante et batterie énergie.
  4. Proxies usuall autorise l’accès HTTP à votre appareil.
  5. Exposer votre base de données directement au client a sécurité implications.

Les services Web peuvent fournir des fonctionnalités supplémentaires en plus de la connexion JDBC, telles que authentification / qualité du service/ autorisation / conditionnel GET request/ error traitement, etc. JDBC ne peut en faire aucune.

6
Deepak Bala

En plus de tout ce que Craig Ringer a dit, ce sur quoi je suis tout à fait d'accord, JDBC a un autre problème: il va forcer à exposer votre base de données au monde entier. Si vous souhaitez que les appareils Android y accèdent, vous devez fournir à votre application les informations d'identification de la base de données, laquelle doit être accessible au public.

L'utilisation d'un API WebService ou RESTful est clairement la voie à suivre pour sécuriser votre application.

4
Pablo Santa Cruz

Une autre option consisterait à utiliser un outil de synchronisation de base de données tel que SymmetricDS.

Cela vous permettrait d’avoir une base de données Postgres sur votre serveur et une base de données SQLite sur votre tablette.

SymmetricDS synchroniserait les bases de données via HTTP lorsqu'une connexion serait disponible. Bien entendu, il n'est pas nécessaire de synchroniser toute la base de données, mais uniquement les parties pertinentes.

(Je ne suis pas affilié à SymmetricDS)

0
Neil McGuigan