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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この章で紹介する記事は NavicatforMySQL ソフトウェアに関するものです。NavicatforMySQL がどのようにローカル MySQL データベースに接続するかご存知ですか? 次に、エディタは、NavicatforMySQL がローカル MySQL データベースに接続する方法を示します。興味のあるユーザーは以下を参照してください。見てください。 Navicatformysql がインストールされているコンピューターを開き、右上隅の「接続」オプションをクリックします。ポップアップの新しい接続ウィンドウで、接続名を入力し、ホスト名をローカル データベースに設定できます。 「localhost」を使用します。パスワードは空白のままにしてください。そして、便利なデータベースへの接続に成功すると、

Docker を使用して MySQL をデプロイした後、接続速度が遅くなりましたが、オンラインで検索した結果、最小限のコンテナーのインストール時に DNS 解決などのモジュールが不足していることが問題の原因である可能性があることがわかりました。そのため、接続時に超遅いという問題が発生しますが、この文を直接追加してskip-name-resolveを追加し、docker-compose.ymlの設定を直接変更します。 設定は以下のとおりです version: "3" services: mysql: image : mysql: 最新コンテナ名: mysql_composerestart: alwaysports:-3306:3306command:--default-a

Python プログラムで MySQL 接続の高い同時実行パフォーマンスを最適化するにはどうすればよいですか?要約: MySQL は強力なパフォーマンスを備えたリレーショナル データベースですが、同時実行性が高い場合、Python プログラムの接続およびクエリ操作がシステムのパフォーマンスに影響を与える可能性があります。この記事では、Python プログラムと MySQL データベースのパフォーマンスを向上させるための最適化テクニックをいくつか紹介します。接続プールを使用する: 同時実行性が高い状況では、データベース接続の作成と終了を頻繁に行うと、大量のシステム リソースが消費されます。したがって、接続プーリングを使用すると、効果的に接続を削減できます。

MySQL 接続数がデータベースのパフォーマンスに与える影響の分析 インターネット アプリケーションの継続的な開発に伴い、データベースはアプリケーション システムをサポートする重要なデータ ストレージおよび管理ツールになりました。データベース システムにおいて、接続数はデータベース システムのパフォーマンスと安定性に直接関係する重要な概念です。この記事では、MySQL データベースの観点から開始し、データベースのパフォーマンスに対する接続数の影響を調査し、特定のコード例を通じて分析します。 1. 接続数はどれくらいですか?接続数とは、データベース システムが同時にサポートするクライアント接続の数を指し、管理することもできます。

MySQL 接続が異常終了した後のデータ損失にどう対処するか? MySQL データベースを使用している場合、さまざまな理由によりデータベース接続が異常終了し、現在の操作が中断されるだけでなく、送信されたデータが失われる可能性があります。この問題を解決するには、MySQL 接続が異常終了した後のデータ損失に対処するための何らかの措置を講じる必要があります。まず第一に、明確にする必要があります: MySQL はトランザクションをサポートするデータベースであり、トランザクションは一連の操作であり、すべてが送信されるか、

MySQL 接続がリセットされました。接続キープアライブを通じて接続プールの健全性を確認するにはどうすればよいですか? MySQL データベースを使用する場合、接続がリセットされてデータベース接続が中断される状況がよく発生しますが、これはアプリケーションにとって非常に信頼性が低くなります。この問題を解決するには、接続を維持して接続プールの健全性を確保します。接続キープアライブとは、接続がアイドル状態のときに特定のクエリ ステートメントを送信して、接続をアクティブに保ち、サーバーによって接続がアクティブに閉じられるのを防ぐことを意味します。この特定のクエリ ステートメントは単純な SE にすることができます。

Java 環境変数の設定を有効にするにはどうすればよいですか? Java 開発では、Java 環境変数を正しく構成することが非常に重要な手順です。 Java 環境変数を適切に構成すると、アプリケーションがスムーズに実行され、多くの潜在的な問題を回避できます。この記事では、Java 環境変数を正しく構成するための手順とサンプル コードを示します。まず、オペレーティング システムの [システムのプロパティ] ウィンドウを開きます。オペレーティング システムが異なれば、開く方法も異なります。一般的なシステムのいくつかの開く方法は次のとおりです。

コマンドラインから MySQL 接続の更新パフォーマンスをテストするにはどうすればよいですか? MySQL データベースのパフォーマンス テストを実行する場合、多くの場合、データベースの接続と更新のパフォーマンスをテストする必要があります。この記事では、コマンド ライン ツールを使用して MySQL 接続の更新パフォーマンス テストを実行する方法を紹介します。まず、MySQL と MySQL コマンド ライン ツールがインストールされていることを確認してください。ステップ 1: テスト データベースとテーブルを作成する コマンド ラインに次のコマンドを入力して、新しいテスト データベースとテーブルを作成します: mysql-uroot-pCREATE
