es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Interrumpir consultas en ejecución antes de cerrar la conexión en el conector de Python de MySQL.

Estoy ejecutando una serie de consultas SQL a través del conector SQL de Python que pueden llevar mucho tiempo. Estoy utilizando el paquete interruptingcow para detener las consultas que están tardando más de 10 segundos. Luego cierro el cursor y la conexión cuando identifico este tipo de consulta para intentar eliminarlas correctamente.

Pero sospecho que estas consultas siguen ejecutándose en el servidor incluso cuando se cierra la conexión, lo que ralentiza el tiempo de ejecución de las demás consultas.
¿Existe una solución para eliminar todas las consultas que se están ejecutando en el servidor antes de abrir una nueva conexión? Tal vez podría mantener abierta la conexión y el cursor si es posible.

Aquí está la parte del código que estoy utilizando:

from interruptingcow import timeout
import mysql.connector

cursor = cnx.cursor()
cursor_abierto = True

for email in emails:

    if cursor_abierto is False:
        cnx = mysql.connector.connect(**config)
        cursor = cnx.cursor()

    query = journey_query.format(email=email)
    try:
        with timeout(10, exception=RuntimeError):
            results = cursor.execute(query, multi=True)
            for result in results:
                if result.with_rows:
                    abc = result.fetchall()[0]
                else:
                    continue
    except RuntimeError:
        cursor.close()
        cnx.close()
        cursor_abierto = False
        continue

cursor.close()
cnx.close()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para abordar este problema, puedes utilizar el método kill del módulo mysql-connector para detener cualquier consulta que aún esté en ejecución en el servidor después de cerrar la conexión. Aquí tienes un ejemplo de cómo puedes aplicarlo en tu código:

    from interruptingcow import timeout
    import mysql.connector
    
    cursor = None
    
    for email in emails:
    
        if not cursor:
            cnx = mysql.connector.connect(**config)
            cursor = cnx.cursor()
    
        query = journey_query.format(email=email)
        try:
            with timeout(10, exception=RuntimeError):
                results = cursor.execute(query, multi=True)
                for result in results:
                    if result.with_rows:
                        abc = result.fetchall()[0]
                    else:
                        continue
        except RuntimeError:
            cursor.close()
            cnx.close()
            cursor = None
            continue
    
        # Detener cualquier consulta que aún esté en ejecución en el servidor después de cerrar la conexión
        if not cursor.is_connected():
            cursor.kill()
    
    cursor.close()
    cnx.close()
    

    En este código modificado, solo cerramos la conexión y el cursor si ocurre la excepción RuntimeError. De lo contrario, mantenemos abierta la conexión y el cursor para obtener un mejor rendimiento. Además, verificamos si el cursor todavía está conectado antes de detener cualquier consulta que aún pueda estar en ejecución en el servidor.

    Ten en cuenta que detener consultas en ejecución puede tener consecuencias no deseadas, así que utiliza esta solución con precaución. Siempre es mejor optimizar tus consultas o el rendimiento del servidor para reducir las posibilidades de que ocurran consultas tan largas en primer lugar.

Comments are closed.