2012-05-10 5 views
5

Trabajo con Oracle y Mysql, y me cuesta entender por qué las API no están escritas de manera que pueda emitir una llamada, irme y hacer otra cosa, y luego volver y recogerla más tarde, por ejemplo, NIO - Estoy forzado dedicar un hilo a la espera de datos. Parece que las interfaces SQL son el único lugar donde aún se fuerza el IO de sincronización, lo que significa atar un hilo esperando el DB.¿Por qué los principales proveedores de DB no proporcionan API realmente asíncronas?

¿Alguien puede explicar los motivos de esto? ¿Hay algo fundamental que lo haga difícil?

Sería genial poder usar 1-2 hilos para gestionar mi problema de consulta de base de datos y búsqueda de resultados, en lugar de utilizar hilos de trabajo para recuperar datos.

Me doy cuenta de que hay dos intentos experimentales (por ejemplo: adbcj) en la implementación de una API asíncrona, pero ninguno parece estar listo para el uso de producción.

+0

Yo también estaba sorprendido por esto. –

Respuesta

1

Los servidores de bases de datos deben poder manejar miles de clientes. Para proporcionar una interfaz asíncrona, el servidor de BD necesitará mantener el conjunto de resultados de la consulta en la memoria, para que pueda retomarlo en una etapa posterior. Pronto quedará sin recursos.

+1

Veo tu punto, hasta cierto punto, aunque esto tiene que suceder de todos modos; buscar resultados grandes normalmente no recupera un conjunto de resultados completo de una vez. – jasonk

1

Un problema considerable con async es que muchas bibliotecas utilizan threadlocal para las transacciones.

Por ejemplo, en Java Gran parte de la especificación JDBC se basa en un comportamiento síncrono para lograr un solo hilo por transacción. Es usted que escribe su transacción en orden de procedimiento.

Para hacerlo bien las transacciones tendrían que hacerse a través de la devolución de llamada, pero no es así. Solo conozco node.js que hace esto pero no está claro si es realmente asincrónico.

Por supuesto, incluso si lo hace de manera asincrónica, no estoy seguro de si realmente mejorará el rendimiento, ya que la base de datos en sí misma probablemente lo esté haciendo sincrónicamente.

Hay un montón de maneras de evitar la superpoblación hilo en (Java): Is asynchronous jdbc call possible?

personalmente para solucionar este problema que utilizar un bus de mensajes como RabbitMQ.

Cuestiones relacionadas