Ошибки MySQL: Потеряно соединение с сервером MySQL по адресу ‘192.168.1.131:3306’, системная ошибка: 8 EOF произошло нарушение протокола (_sl.c:2162)

#python #mysql #python-3.x #multithreading

Вопрос:

Я пытаюсь выполнить вставку SQL с помощью потока, и я теряю соединение и получаю сообщение об ошибке от SQL. Я не могу определить, в чем проблема самостоятельно, и хотел бы спросить StackOverflow, что, по их мнению, может быть источником ошибки.

Сначала я прикрепил сообщение об ошибке, а затем код, который выполняется.

Ошибка

 Exception in thread Thread-160:
Traceback (most recent call last):
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/network.py", line 161, in send_plain
    self.sock.sendall(packet)
  File "/usr/lib/python3.6/ssl.py", line 975, in sendall
    v = self.send(byte_view[count:])
  File "/usr/lib/python3.6/ssl.py", line 944, in send
    return self._sslobj.write(data)
  File "/usr/lib/python3.6/ssl.py", line 642, in write
    return self._sslobj.write(data)
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2162)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "trt_yolo_tracklite_mysql.py", line 148, in mysql_insert
    cursor.execute(sql_op, (copy_today, copy_time, confidence, identity, x1, y1, x2, y2, img_blob))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/cursor.py", line 568, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/connection.py", line 846, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/connection.py", line 495, in _send_cmd
    packet_number, compressed_packet_number)
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/network.py", line 164, in send_plain
    errno=2055, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at '192.168.1.131:3306', system error: 8 EOF occurred in violation of protocol (_ssl.c:2162)

 

и это приводит к аналогичным ошибкам для каждой итерации цикла

 
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "trt_yolo_tracklite_mysql.py", line 148, in mysql_insert
    cursor.execute(sql_op, (copy_today, copy_time, confidence, identity, x1, y1, x2, y2, img_blob))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/cursor.py", line 568, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/connection.py", line 846, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/connection.py", line 495, in _send_cmd
    packet_number, compressed_packet_number)
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/network.py", line 164, in send_plain
    errno=2055, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at '192.168.1.131:3306', system error: 8 EOF occurred in violation of protocol (_ssl.c:2162)

Exception in thread Thread-164:
Traceback (most recent call last):
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/network.py", line 161, in send_plain
    self.sock.sendall(packet)
  File "/usr/lib/python3.6/ssl.py", line 975, in sendall
    v = self.send(byte_view[count:])
  File "/usr/lib/python3.6/ssl.py", line 944, in send
    return self._sslobj.write(data)
  File "/usr/lib/python3.6/ssl.py", line 642, in write
    return self._sslobj.write(data)
BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "trt_yolo_tracklite_mysql.py", line 148, in mysql_insert
    cursor.execute(sql_op, (copy_today, copy_time, confidence, identity, x1, y1, x2, y2, img_blob))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/cursor.py", line 568, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/connection.py", line 846, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/connection.py", line 495, in _send_cmd
    packet_number, compressed_packet_number)
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/network.py", line 164, in send_plain
    errno=2055, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at '192.168.1.131:3306', system error: 32 Broken pipe


Exception in thread Thread-162:
Traceback (most recent call last):
  File "/home/user/.local/lib/python3.6/site-packages/mysql/connector/network.py", line 161, in send_plain
    self.sock.sendall(packet)
  File "/usr/lib/python3.6/ssl.py", line 975, in sendall
    v = self.send(byte_view[count:])
  File "/usr/lib/python3.6/ssl.py", line 944, in send
    return self._sslobj.write(data)
  File "/usr/lib/python3.6/ssl.py", line 642, in write
    return self._sslobj.write(data)
BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

 

Here is the code being run:

 
This script demonstrates how to do real-time object detection with
TensorRT optimized YOLO engine.
"""


import os
import time
import argparse

import cv2
import pycuda.autoinit  # This is needed for initializing CUDA driver
import mysql.connector
from mysql.connector import pooling

from datetime import date

#import local classes and their functions
from utils.yolo_classes import get_cls_dict
from utils.camera import add_camera_args, Camera
from utils.display import open_window, set_display, show_fps
from utils.visualization import BBoxVisualization
from utils.yolo_with_plugins_tracklite_mysql import TrtYOLO
from tracklite.utils.parser import get_config
from threading import Thread, Lock

WINDOW_NAME = 'TrtYOLODemo'

database = mysql.connector.connect(
    host='192.168.1.131',
    user='*******'
    password='*********',
    database='bird_detections'
)

cursor = database.cursor()



sql_op = 'INSERT INTO nano_detections (DATE, TIME, CONFIDENCE, IDENTITY, X1, Y1, X2, Y2, IMG) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'





mutex = Lock()

WINDOW_NAME = 'TrtYOLODemo'



def parse_args():
    """Parse input arguments."""
    desc = ('Capture and display live camera video, while doing '
            'real-time object detection with TensorRT optimized '
            'YOLO model on Jetson')
    parser = argparse.ArgumentParser(description=desc)
    parser = add_camera_args(parser)
    parser.add_argument(
        '-c', '--category_num', type=int, default=80,
        help='number of object categories [80]')
    parser.add_argument(
        '-m', '--model', type=str, required=True,
        help=('[yolov3-tiny|yolov3|yolov3-spp|yolov4-tiny|yolov4|'
              'yolov4-csp|yolov4x-mish]-[{dimension}], where '
              '{dimension} could be either a single number (e.g. '
              '288, 416, 608) or 2 numbers, WxH (e.g. 416x256)'))
    parser.add_argument(
        '-l', '--letter_box', action='store_true',
        help='inference with letterboxed image [False]')
    args = parser.parse_args()
    return args



def loop_and_detect(cam, trt_yolo, conf_th, vis):
    """Continuously capture images from camera and do object detection.

    # Arguments
      cam: the camera instance (video source).
      trt_yolo: the TRT YOLO object detector instance.
      conf_th: confidence/score threshold for object detection.
      vis: for visualization.
    """
    today = date.today()
    #full_screen is set to false by default
    full_scrn = False
    #fps is set at 0 by default
    fps = 0.0
    #create time variable for measuring the frames per second in real time
    tic = time.time()
    #while loop to perform inference
    while True:
        mutex.acquire()
        today_formatted = today.strftime("%y-%m-%d")
        time_formatted = time.strftime("%H:%M:%S")
        #determine if window is closed or not ????
        #break the loop if window is closed
        if cv2.getWindowProperty(WINDOW_NAME, 0) < 0:
            break
        #create img object from a reading of the camera frame
        img = cam.read()
        image_blob = cv2.imencode('.jpg', img)[1].tostring()
        #break loop if the camera frame is none
        if img is None:
            break
        #create bounding box coordinate, detection confidence, and class id from the detect function of the trt_yolo object.
        img, outputs, scores = trt_yolo.detect(img, conf_th)
        t = Thread(target=mysql_insert, args=(outputs, scores, today_formatted, time_formatted, image_blob))
        mutex.release()
        t.start()
        mutex.acquire()
        #img = vis.draw_bboxes(img, boxes, confs, clss)
        img = show_fps(img, fps)
        cv2.imshow(WINDOW_NAME, img)
        toc = time.time()
        curr_fps = 1.0 / (toc - tic)
        # calculate an exponentially decaying average of fps number
        fps = curr_fps if fps == 0.0 else (fps*0.95   curr_fps*0.05)
        tic = toc
        key = cv2.waitKey(1)
        if key == 27:  # ESC key: quit program
            break
        elif key == ord('F') or key == ord('f'):  # Toggle fullscreen
            full_scrn = not full_scrn
            set_display(WINDOW_NAME, full_scrn)
        mutex.release()

def mysql_insert(outputs, scores, today, time, img_blob):
    mutex.acquire()
    copy_outputs = outputs
    copy_scores = scores
    copy_today= today
    copy_time = time
    mutex.release()
    if len(outputs) > 0:
        bbox_xyxy = copy_outputs[:, :4]
        identities = copy_outputs[:, -1]
        for box, identity, score in zip(bbox_xyxy, identities, copy_scores):
            if score > 0 :
                x1 = str(box[0])
                y1 = str(box[1])
                x2 = str(box[2])
                y2 = str(box[3])
                identity = str(identity)
                confidence = str(score)
                cursor.execute(sql_op, (copy_today, copy_time, confidence, identity, x1, y1, x2, y2, img_blob))
                database.commit()
    #cursor.close()
    #conn.close()


def test_insert():
    sql_insert = 'INSERT INTO test_table(TEST_STRING) VALUES (%s)'
    string_to_insert = 'TEST'
    cursor.execute(sql_insert, (string_to_insert))

def main():
    cfg_file = "./tracklite/configs/deep_sort.yaml"
    cfg = get_config()
    cfg = cfg.merge_from_file(cfg_file)
    #parse arguments
    args = parse_args()
    #raise errors for lack of arguments, such as the category number and the model file
    if args.category_num <= 0:
        raise SystemExit('ERROR: bad category_num (%d)!' % args.category_num)
    if not os.path.isfile('yolo/%s.trt' % args.model):
        raise SystemExit('ERROR: file (yolo/%s.trt) not found!' % args.model)

    #camera object instantiated with arguments
    cam = Camera(args)
    #raise error if cameras is not opened
    if not cam.isOpened():
        raise SystemExit('ERROR: failed to open camera!')

    #create list of classes to be detected
    cls_dict = get_cls_dict(args.category_num)
    #instantiate vis object with class_dict passed as an argument
    #BBOXVisualization contains code to draw boxes and assign colors to each class
    vis = BBoxVisualization(cls_dict)
    #instantiate the TtrYOLO object based on the arguments given in the command to start trt_yolo.py
    trt_yolo = TrtYOLO(args.model, cfg, args.category_num, args.letter_box)

    #open a window based on camera height and width
    open_window(
        WINDOW_NAME, 'Camera TensorRT YOLO Demo',
        cam.img_width, cam.img_height)

    #loop and perform detections
    loop_and_detect(cam, trt_yolo, conf_th=0.3, vis=vis)


    cam.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()


#Decoding Image From SQL:
#nparr = np.fromstring(STRING_FROM_DATABASE, np.uint8)
#img = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)
 

I at first thought the issue was because I needed to use pooled connections, but I am encountering the same error or an error related to exhausted connections when I modify the above code to use pooled connections. Based on the error message I think that there is a problem in the data that I am inserting, but I do not know how to properly read this error and I need some help.