Go Multi-Goroutine共有データベース接続のエレガントなクローズ
Go Compurrentプログラミングでは、複数のGoroutine共有データベース接続が一般的なシナリオです。不適切な接続シャットダウンにより、データの損失やプログラムのクラッシュが発生する可能性があります。この記事では、複数のゴロウチン共有のデータベース接続を安全に閉じる方法について説明します。
問題分析:
メインゴルウチンでdefer db.Close()
直接使用することは、すべての子供ゴルチンがデータベース操作を完了したことを保証することはできません。これにより、接続が事前に閉じてエラーが発生する可能性があります。各子供のゴルチンでdefer db.Close()
を使用すると、接続が複数回閉じられ、同じエラーが発生します。
解決:
カウンターとsync.WaitGroup
使用して、ゴロウチンの実行とデータベース接続の閉鎖を調整することをお勧めします。
サンプルコード:
パッケージメイン 輸入 ( 「FMT」 「同期」 "時間" 「データベース/SQL」 _ "github.com/go-sql-driver/mysql" //データベースドライバーに置き換えます) タイプdbconn struct { conn *sql.db wg *sync.waitgroup } func opendb()(*dbconn、error){ db、err:= sql.open( "mysql"、 "user:password@tcp(127.0.0.1:3306)/database")// err!= nil {の場合、データベース接続文字列に置換 nil、errを返します } return&dbconn {conn:db、wg:&sync.waitgroup {}}、nil } func(dc *dbconn)close()error { dc.wg.wait()//すべてのゴルチンがreturn dc.conn.close()を完了するのを待ちます } func querydb(dc *dbconn、i int){ dc.wg.done()を延期する dc.wg.add(1)//カウンターが追加されます1 // ...データベース操作... time.sleep(time.second)//データベース操作のシミュレーション時間消費fmt.printf( "goroutine%d finent \ n"、i) } func main(){ dc、err:= opendb() err!= nil { fmt.println( "エラーオープニングデータベース:"、err) 戻る } dc.close()// dc.close()// i:= 0の最後に接続を閉じるようにしてください。 I <p><strong>コード説明:</strong></p><ol> <li> <code>dbConn</code>構造には、Goroutinesの実行を管理するためのデータベース接続と<code>sync.WaitGroup</code>が含まれています。</li> <li> <code>openDb</code>関数はデータベース接続を開き、 <code>dbConn</code>インスタンスを返します。</li> <li> <code>close</code> Methodでは<code>dc.wg.Wait()</code>を使用して、すべてのゴルチンが完了するのを待ってからデータベース接続を閉じる前に完了します。</li> <li> <code>querydb</code>関数は<code>dc.wg.Add(1)</code>を使用してデータベース操作を実行する前にカウンターを増やし、 <code>defer dc.wg.Done()</code>を使用して操作が完了した後にカウンターを減らします。</li> <li> <code>main</code>関数は、 <code>querydb</code>関数を実行するために複数のゴルチンを開始し、 <code>defer dc.close()</code>を使用してデータベース接続を閉じます。</li> </ol><p>この方法により、すべてのゴルチンがデータベース操作を完了し、データベース接続を閉じることが保証され、データの損失とエラーが回避されます。サンプルコードのデータベース接続文字列とドライバーを置き換えることを忘れないでください。データベースの操作時間が予測不可能な場合、チャネルを使用したシグナリングなど、すべてのゴルチンが完了するのを待つために、より複雑なメカニズムが必要になる場合があります。</p>
以上がGO言語で共有されている複数のゴロウチンのデータベース接続を適切に閉じるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

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

Dreamweaver Mac版
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ホットトピック



