Me gustaría acceder a una base de datos de forma no bloqueante, es decir, enviaré la solicitud SQL a través de un socket y leeré la respuesta de la consulta a través del mismo socket asincrónicamente . Eso significa que solo leo datos del socket cuando están disponibles (Java NIO SocketChannel), por lo que nunca bloqueo.

Puede que esté equivocado, pero hasta donde yo sé, los controladores JDBC para bases de datos usan sockets de bloqueo.

Incluso si tengo que ejecutar una consulta que devuelve 1 millón de líneas, puedo hacerlo de forma asincrónica, recibiendo líneas a medida que estén disponibles en el búfer de socket.

Mi objetivo es ejecutar una consulta SQL sin bloquear nunca (es decir, sin producir latencia). Usar un hilo separado no es una opción . Necesito hacer eso dentro del hilo de la red (hilo selector de NIO).

¿Alguien ha logrado hacer esto o puede recomendar un enfoque que no implique un hilo adicional?

16
Richard Bradley 24 ene. 2015 a las 20:16

2 respuestas

La mejor respuesta

Es posible, pero no con JDBC. A menos que desee utilizar la interfaz SocketChannel sin procesar y analizar los resultados usted mismo, los únicos controladores de base de datos asíncronos en la JVM que conozco son https://github.com/mauricio/postgresql-async (que a pesar del nombre también es compatible con MySQL). Están escritos en Scala, pero debería ser posible llamarlos desde Java (ya que es un lenguaje JVM), aunque no puedo decir qué tan compatible con Java será la API.

12
lmm 24 ene. 2015 a las 17:23

Si escribe su propio controlador, ciertamente sería posible hacerlo para la mayoría de las bases de datos.

Sin embargo, no conozco ningún controlador que haga esto "fuera de la caja".

0
erickson 24 ene. 2015 a las 17:20