Una base de dades no bloquejant és una forma d'accés a una base de dades en què les operacions de consulta o escriptura no aturen l'execució del programa mentre s'espera la resposta del servidor. Aquest model s'utilitza en aplicacions basades en programació asíncrona i en operacions d'entrada/sortida en què el programa pot continuar executant altres tasques mentre una petició a la base de dades resta pendent.Fowler, Matthew. Python Concurrency with asyncio. Shelter Island, New York: Manning Publications, 2022. ISBN 9781617298660.

En aquest context, el terme no fa referència a una classe específica de sistema gestor de bases de dades, sinó a la manera com una aplicació hi accedeix. L'accés no bloquejant depèn habitualment de controladors o biblioteques que ofereixen interfícies asíncrones per enviar consultes, esperar-ne la resposta i processar-ne el resultat sense bloquejar el fil principal d'execució.

Funcionament En un accés bloquejant tradicional, el programa envia una consulta a la base de dades i el fil que l'ha iniciada queda aturat fins que el servidor retorna el resultat. Aquest comportament pot ser suficient en programes senzills, però pot limitar la capacitat de resposta d'una aplicació quan hi ha moltes operacions d'entrada/sortida pendents.

En l'accés no bloquejant, la consulta es registra com una operació pendent i el control torna al sistema d'execució asíncron. Aquest sistema sol estar gestionat per un bucle d'esdeveniments, que s'encarrega de reprendre la tasca corresponent quan la resposta de la base de dades ja està disponible. Segons la documentació de Python, el bucle d'esdeveniments és el nucli de les aplicacions basades en asyncio i permet executar tasques asíncrones, operacions d'entrada/sortida de xarxa i altres callbacks.

Aquest model permet solapar el temps d'espera de diverses operacions independents. La millora no prové necessàriament d'executar codi en paral·lel al processador, sinó d'evitar que el programa resti inactiu mentre espera respostes de xarxa, de disc o d'un servidor de base de dades.

Controladors asíncrons Els controladors de bases de dades no bloquejants proporcionen una interfície que permet executar consultes mitjançant operacions asíncrones. En Python, un exemple és asyncpg, una biblioteca dissenyada per accedir a PostgreSQL amb el marc asyncio.

Aquest tipus de controlador permet escriure consultes que es poden esperar amb mecanismes propis de la programació asíncrona. Això facilita que una aplicació pugui mantenir diverses operacions pendents sense crear necessàriament un fil d'execució per a cadascuna.

Agrupació de connexions En aplicacions amb moltes consultes concurrents, l'accés no bloquejant sol combinar-se amb una agrupació de connexions. Una agrupació de connexions manté diverses connexions obertes amb la base de dades i les assigna temporalment a les operacions que les necessiten. Quan una consulta acaba, la connexió pot retornar a l'agrupació i ser reutilitzada per una altra operació.

Aquest mecanisme és important perquè una única connexió no sempre és suficient per gestionar diverses consultes independents de manera eficient. L'ús d'una agrupació evita obrir i tancar connexions constantment i permet distribuir millor les consultes entre les connexions disponibles.

Aplicacions Les bases de dades no bloquejants són habituals en serveis web, microserveis i aplicacions que han de respondre a moltes peticions simultànies. En aquests entorns, una aplicació pot rebre una petició d'un client, iniciar una consulta a la base de dades i continuar atenent altres peticions mentre espera el resultat.

Aquest enfocament és especialment útil en càrregues de treball limitades per entrada/sortida. En canvi, no resol per si mateix els problemes de rendiment causats per càlculs intensius de processador, ja que aquests poden continuar bloquejant el fil d'execució si no es deleguen a altres mecanismes de concurrència o paral·lelisme.

Vegeu també Base de dades Programació asíncrona Concurrència Entrada/sortida Bucle d'esdeveniments PostgreSQL

Referències

Categoria:Bases de dades