MySQL连接hang住问题分析
Linux c多线程连接mysql数据库,每次都是短连接,操作完后就释放连接,有时候会出现mysql_real_connect挂住的现象,挂住超时mysql
【问题现象】:
1. Linux c多线程连接mysql数据库,每次都是短连接,操作完后就释放连接,有时候会出现mysql_real_connect挂住的现象
2. 挂住超时mysql_real_connect返回后报错如下:Lostconnection to MySQL server at 'reading initial communication packet', systemerror: 104,返错后线程号没变,会继续往下运行
【初步原因分析】:
1. mysql_real_connect连接数据库, 没有显式调用超时时间,重连什么的,,使用的默认值:
2. 昨天拿c mysqlclient的源码进行了分析测试,发现以下几个配置项的默认值(如果调mysql_real_connect之前没有设置任何属性,mysql client端的机器上/etc/my.cnf也没有配置)如下:
connect_timeout = 0
read_timeout = 0
write_timeout = 0
reconnect = 0 //1表示自动重连
所以这些参数是需要显式设置的。
{net = {vio = 0x7b8f150, options = {connect_timeout = 0, read_timeout = 0, write_timeout = 0,}
3. Mysqlclient中报错的代码如下(与服务端连接建立后,读解析包的时候失败了):
/*
Part 1: Connection established, read and parse first packet
*/
if ((pkt_length=cli_safe_read(mysql)) == packet_error)
{
if (mysql->net.last_errno == CR_SERVER_LOST)
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
ER(CR_SERVER_LOST_EXTENDED),
"reading initial communication packet",
errno);
fprintf(myfp,"%s after cli_safe_read packet_error \n",cur_time());
goto error;
}
线程阻塞时抓到的堆栈如下:
#0 0x0000003ebe0c5f3b in read () from /lib64/libc.so.6
#1 0x00007f240dd91430 in vio_read () from /usr/lib/libmysql.so.16.0.0
#2 0x00007f240dcf9b05 in my_real_read () from /usr/lib/libmysql.so.16.0.0
#3 0x00007f240dcf9e38 in my_net_read () from /usr/lib/libmysql.so.16.0.0
#4 0x00007f240dcec396 in cli_safe_read () from /usr/lib/libmysql.so.16.0.0
#5 0x00007f240dceea17 in mysql_real_connect () from /usr/lib/libmysql.so.16.0.0

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Der Artikel in diesem Kapitel befasst sich mit der NavicatforMySQL-Software. Wissen Sie, wie NavicatforMySQL eine Verbindung zur lokalen MySQL-Datenbank herstellt? Schau mal. Öffnen Sie den Computer, auf dem Navicatformysql installiert wurde, und klicken Sie dann auf die Option „Verbinden“ in der oberen rechten Ecke. Im Popup-Fenster für neue Verbindungen können Sie den Verbindungsnamen eingeben und den Hostnamen auf die lokale Datenbank festlegen Verwenden Sie „localhost“. Lassen Sie das Passwort einfach leer. Wenn dann die Verbindung zur praktischen Datenbank erfolgreich ist,

Nachdem ich Docker zum Bereitstellen von MySQL verwendet habe, ist die Verbindungsgeschwindigkeit langsam. Durch Online-Suchen habe ich herausgefunden, dass das Problem möglicherweise durch das Fehlen von Modulen wie der DNS-Auflösung während der minimalen Containerinstallation verursacht wird. Daher tritt beim Herstellen einer Verbindung ein Problem mit einer sehr langsamen Verbindung auf. Wir fügen diesen Satz „skip-name-resolve“ direkt hinzu und ändern die Konfiguration von „docker-compose.yml“ wie folgt: Version: „3“ -Dienste: mysql: image : mysql: Latestcontainer_name: mysql_composerestart: Alwaysports:-3306:3306command:--default-a

Wie kann die hohe Parallelitätsleistung von MySQL-Verbindungen in einem Python-Programm optimiert werden? Zusammenfassung: MySQL ist eine relationale Datenbank mit hoher Leistung. Bei hoher Parallelität können jedoch die Verbindungs- und Abfragevorgänge von Python-Programmen die Leistung des Systems beeinträchtigen. In diesem Artikel werden einige Optimierungstechniken vorgestellt, um die Leistung von Python-Programmen und MySQL-Datenbanken zu verbessern. Verbindungspool verwenden: In Situationen mit hoher Parallelität verbraucht das häufige Erstellen und Schließen von Datenbankverbindungen viele Systemressourcen. Daher kann die Verwendung von Verbindungspooling effektiv reduziert werden

Analyse des Einflusses der MySQL-Verbindungsnummer auf die Datenbankleistung Mit der kontinuierlichen Entwicklung von Internetanwendungen sind Datenbanken zu einem wichtigen Datenspeicher- und Verwaltungstool zur Unterstützung von Anwendungssystemen geworden. Im Datenbanksystem ist die Anzahl der Verbindungen ein wichtiges Konzept, das in direktem Zusammenhang mit der Leistung und Stabilität des Datenbanksystems steht. Dieser Artikel beginnt aus der Perspektive der MySQL-Datenbank, untersucht die Auswirkungen der Anzahl von Verbindungen auf die Datenbankleistung und analysiert sie anhand spezifischer Codebeispiele. 1. Wie viele Verbindungen gibt es? Die Anzahl der Verbindungen bezieht sich auf die Anzahl der Client-Verbindungen, die das Datenbanksystem gleichzeitig unterstützt. Es kann auch verwaltet werden

Wie gehe ich mit Datenverlust um, nachdem die MySQL-Verbindung abnormal beendet wurde? Bei Verwendung der MySQL-Datenbank kommt es manchmal aus verschiedenen Gründen zu einem abnormalen Abbruch der Datenbankverbindung. Dies führt nicht nur zu einer Unterbrechung des aktuellen Vorgangs, sondern kann auch zum Verlust der übermittelten Daten führen. Um dieses Problem zu lösen, müssen wir einige Maßnahmen ergreifen, um den Datenverlust zu bewältigen, nachdem die MySQL-Verbindung abnormal beendet wurde. Zunächst müssen wir klarstellen: MySQL ist eine Datenbank mit Transaktionsunterstützung. Eine Transaktion ist eine Reihe von Vorgängen, die entweder alle übermittelt werden.

Die MySQL-Verbindung wird zurückgesetzt. Wie kann der Zustand des Verbindungspools durch Verbindungs-Keep-Alive sichergestellt werden? Bei der Verwendung der MySQL-Datenbank kommt es häufig zu Situationen, in denen die Verbindung zurückgesetzt wird, was zu einer Unterbrechung der Datenbankverbindung führt, was für die Anwendung sehr unzuverlässig ist. Um dieses Problem zu lösen, können Sie den Zustand des Verbindungspools sicherstellen, indem Sie die Verbindung am Leben halten. Unter Verbindungs-Keep-Alive versteht man das Senden einer bestimmten Abfrageanweisung, wenn die Verbindung inaktiv ist, um die Verbindung aktiv zu halten und zu verhindern, dass die Verbindung vom Server aktiv geschlossen wird. Diese spezifische Abfrageanweisung kann eine einfache SE sein

Wie kann die Konfiguration der Java-Umgebungsvariablen wirksam werden? Bei der Java-Entwicklung ist die korrekte Konfiguration von Java-Umgebungsvariablen ein sehr wichtiger Schritt. Durch die korrekte Konfiguration von Java-Umgebungsvariablen kann sichergestellt werden, dass Ihre Anwendung reibungslos läuft und viele potenzielle Probleme vermieden werden. Dieser Artikel enthält einige Schritte und Beispielcode, die Ihnen bei der korrekten Konfiguration von Java-Umgebungsvariablen helfen. Öffnen Sie zunächst das Fenster „Systemeigenschaften“ Ihres Betriebssystems. Verschiedene Betriebssysteme haben unterschiedliche Öffnungsmethoden. Im Folgenden sind die Öffnungsmethoden einiger gängiger Systeme aufgeführt: In Wind

Wie teste ich die Update-Leistung einer MySQL-Verbindung über die Befehlszeile? Beim Durchführen von Leistungstests der MySQL-Datenbank ist es häufig erforderlich, die Verbindungs- und Aktualisierungsleistung der Datenbank zu testen. In diesem Artikel wird erläutert, wie Sie mithilfe von Befehlszeilentools Aktualisierungsleistungstests für MySQL-Verbindungen durchführen. Stellen Sie zunächst sicher, dass Sie MySQL und das MySQL-Befehlszeilentool installiert haben. Schritt 1: Erstellen Sie eine Testdatenbank und -tabelle. Geben Sie in der Befehlszeile den folgenden Befehl ein, um eine neue Testdatenbank und -tabelle zu erstellen: mysql-uroot-pCREATE
