GO Multi-Goroutine 공유 데이터베이스 연결의 우아한 클로즈
GO 동시 프로그래밍에서 여러 고루 틴 공유 데이터베이스 연결이 일반적인 시나리오입니다. 부적절한 연결 종료로 인해 데이터 손실 또는 프로그램 충돌이 발생할 수 있습니다. 이 기사에서는 여러 고어 라틴 공유에 대한 데이터베이스 연결을 안전하게 닫는 방법을 살펴 봅니다.
문제 분석 :
기본 고 로우틴에서 직접 defer db.Close()
사용하면 모든 아동 고리 틴이 데이터베이스 작업을 완료했다고 보장 할 수 없으므로 연결이 사전에 닫히고 오류가 발생할 수 있습니다. 각 어린이 고리 틴에서 defer db.Close()
사용하면 연결이 여러 번 닫히고 동일한 오류가 발생합니다.
해결책:
카운터 및 sync.WaitGroup
사용하여 Goroutine의 실행 및 데이터베이스 연결 폐쇄를 조정하는 것이 좋습니다.
샘플 코드 :
패키지 메인 수입 (수입) "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") // 데이터베이스 연결 문자열로 대체! = nil { 반환 nil, err } return & dbconn {conn : db, wg : & sync.waitgroup {}}, nil } func (dc *dbconn) close () 오류 { dc.wg.wait () // 모든 고 루틴이 반환을 완료 할 때까지 기다려 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 완성 \ n", i) } func main () { dc, err : = opendb () err! = nil {인 경우 fmt.println ( "오류 열기 데이터베이스 :", err) 반품 } DC.Close ()을 지연시킵니다. // I : = 0의 연결을 마지막으로 닫으십시오. I <p> <strong>코드 설명 :</strong></p><ol> <li> <code>dbConn</code> 구조에는 데이터베이스 연결 및 <code>sync.WaitGroup</code> 포함되어있어 고루 틴의 실행을 관리합니다.</li> <li> <code>openDb</code> 함수는 데이터베이스 연결을 열고 <code>dbConn</code> 인스턴스를 반환합니다.</li> <li> <code>close</code> 방법은 <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> 이 방법을 사용하면 모든 Goroutine이 데이터베이스 작업을 완료 한 다음 데이터 손실 및 오류를 피하기 위해 데이터베이스 연결을 닫을 수 있습니다. 샘플 코드에서 데이터베이스 연결 문자열 및 드라이버를 교체해야합니다. 데이터베이스 운영 시간이 예측할 수없는 경우, 채널을 사용한 신호와 같은 모든 고어 라인이 완료 될 때까지 더 복잡한 메커니즘이 필요할 수 있습니다.</p>
위 내용은 GO 언어로 공유 된 여러 고루틴의 데이터베이스 연결을 올바르게 닫는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

本篇文章给大家带来了关于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 Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
