sql >> Base de Datos >  >> RDS >> Mysql

JDBC frente a servicio web para Android

Tu piensas es más simple y rápido hacerlo con JDBC porque no está considerando el entorno operativo real de teléfonos y dispositivos portátiles. A menudo tienen una conectividad inestable a través de proxies de reescritura de tráfico con errores y cortafuegos locos. Por lo general, utilizan una capa de transporte de red que tiene tasas de pérdida de paquetes altas y variables y latencias que varían en muchos órdenes de magnitud en períodos cortos de tiempo. TCP realmente no es muy bueno en este entorno y particularmente lucha con conexiones de larga duración.

El beneficio clave de un servicio web es que:

  • Tiene conexiones de corta duración con un estado mínimo, por lo que es fácil volver a donde estaba cuando el dispositivo cambia de red WiFi, a/desde celular, pierde conectividad brevemente, etc. y

  • Puede pasar a través de todos los proxies web excepto los más terribles y draconianos

Usted rutinariamente encontrar problemas con una conexión JDBC directa. Un desafío es agotar el tiempo de forma confiable de las conexiones inactivas, restablecer las sesiones y liberar los bloqueos retenidos por la sesión anterior (ya que es posible que el servidor no decida que está inactivo al mismo tiempo que lo hace el cliente). Otro es la pérdida de paquetes que provoca operaciones muy lentas, transacciones de bases de datos de ejecución prolongada y los consiguientes problemas con la duración de los bloqueos y las tareas de limpieza transaccional. También conocerá todas las variedades de servidores proxy y cortafuegos locos y rotos bajo el sol:servidores proxy que admiten CONNECT pero luego suponga que todo el tráfico es HTTP y destrúyalo si no lo es; cortafuegos con seguimiento de conexión con estado defectuoso que hace que las conexiones fallen o pasen a un estado zombi semiabierto; todos los problemas de NAT que puedas imaginar; los operadores generan "útilmente" TCP ACK para reducir la latencia, sin importar los problemas que causa con el descubrimiento de pérdida de paquetes y el tamaño de la ventana; bloqueo de puertos extravagante; etc.

Porque todos usa HTTP, puede esperar que funcione, al menos, con mucha más frecuencia que cualquier otra cosa. Esto es particularmente cierto ahora que los sitios web comunes usan el estilo de comunicación REST+JSON incluso en aplicaciones web móviles.

También puede escribir sus llamadas de servicio web para que sean idempotentes utilizando tokens de solicitud únicos. Eso permite que su aplicación vuelva a enviar solicitudes de modificación sin temor a que realice una acción contra la base de datos dos veces. Ver idempotence y definiendo idempotencia .

En serio, JDBC desde un dispositivo móvil puede parecer una buena idea ahora, pero la única forma en que lo consideraría sería si todos los dispositivos móviles estuvieran en una única red WiFi de alta confiabilidad bajo mi control directo. Incluso entonces lo evitaría por razones de gestión del rendimiento de la base de datos si pudiera. Puede usar algo como PgBouncer para agrupar conexiones entre muchos dispositivos en el lado del servidor, por lo que la agrupación de conexiones no es un gran problema, pero la limpieza de conexiones perdidas y abandonadas sí lo es, al igual que el tráfico tcp keepalive requerido para que funcione y el largo estancado transacciones de conexiones abandonadas.