Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

파이썬 - PostgreSQL의 with 문을 사용한 경우 연결 개체 누수

psycopg2를 이용하는 경우,

파이썬 - PostgreSQL 환경 구성
; https://www.sysnet.pe.kr/2/0/13077

다음과 같은 같이 코딩하면,

def test_postgre():
    import psycopg2

    with psycopg2.connect(...[생략]...) as db:
        with db.cursor() as cursor:
            sql = "SELECT * FROM TestTable"
            cursor.execute(sql)

with로 사용한 db 연결 개체가 닫히지 않는 현상이 있습니다. 실제로 저 코드를 실행하는 웹 페이지를 방문한 후 PostgreSQL CLI를 통해 pg_stat_activity 테이블을 보면,

# /usr/bin/psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.

root=# select client_addr, client_port from pg_stat_activity;
 client_addr    | client_port 
----------------+-------------
 192.168.100.50 |       33380
 192.168.100.50 |       37612
 192.168.100.50 |       59440
 192.168.100.50 |       40936
 192.168.100.50 |       48864
 192.168.100.50 |       41622
 192.168.100.50 |       47890
 192.168.100.50 |       33652
                |          -1
 172.17.0.1     |       41070
                |            

예제를 실행한 192.168.100.50 측에서의 연결 개체가 남아 있는 것을 볼 수 있습니다.




이에 대한 해답은 ^^;

How to Work with PostgreSQL in Python
; https://khashtamov.com/en/postgresql-with-python-and-psycopg2/

with와 함께 closing을 함께 써줘야 합니다.

def test_postgre():
    import psycopg2
    from contextlib import closing

    with closing(psycopg2.connect(...[생략]...)) as db:
        with db.cursor() as cursor:
            sql = "SELECT * FROM TestTable"
            cursor.execute(sql)

실제로 저렇게 처리한 후에는 pg_stat_activity가 조용해졌습니다. ^^

다른 db provider도 그런 식일까요? 일례로 제가 테스트한 mysql의 경우에는,

with MySQLdb.connect(...[생략]...) as conn:
    conn.encoding = 'utf8'

    with conn.cursor() as cursor:

    query = "SELECT * FROM mytable;"
    cursor.execute(query)

(closing 없이도) 연결 개체를 잘 정리합니다. 마찬가지로 pymysql도 with 구문이 적용됐습니다. 다른 예로는, sqlite3의 경우 아예 지원이 안 되었죠! 이러한 처리가 dbapi2 명세에서 지정하지 않아 그런 것인지는 모르겠지만 암튼 with에 대한 처리를 할 때는 꼭 문서를 확인하든가, 직접 테스트를 해보는 것이 좋겠습니다. ^^;




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/20/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  [169]  170  171  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
835정성태1/26/201026683.NET Framework: 173. WCF - webHttpBinding + IIS 6.0 윈도우 인증 구현 예제 [3]파일 다운로드1
834정성태1/25/201027181.NET Framework: 172. WCF - webHttpBinding 윈도우 인증 구현 예제 [3]파일 다운로드1
833정성태1/25/201026625.NET Framework: 171. WCF - webHttpBinding 구현 예제 [1]파일 다운로드1
832정성태1/25/201030306.NET Framework: 170. PerformanceCounter의 RawValue/NextValue()에서 멈춤 현상
831정성태1/14/201020097개발 환경 구성: 70. WSS - check out 메뉴에서 오류나는 문제
830정성태1/10/201024832개발 환경 구성: 69. Windows Internal Database
829정성태1/7/201024096개발 환경 구성: 68. ODP.NET + OraMTS 사용
828정성태1/7/201031840개발 환경 구성: 67. 환경 변수를 이용한 다중 ODAC 버전 테스트
827정성태1/4/201024175개발 환경 구성: 66. .NET 응용 프로그램에서 64비트 Oracle Data Access Components 사용 (2)
826정성태1/3/201031733기타: 28. 2009년 인기 순위 정리
825정성태1/3/201048486개발 환경 구성: 65. .NET 응용 프로그램에서 64비트 Oracle Data Access Components 사용 [5]
823정성태1/1/201025588개발 환경 구성: 64. ODP.NET 설치 작업 없이 ASP.NET 응용 프로그램 배포파일 다운로드1
822정성태1/1/201088124개발 환경 구성: 63. ODP.NET 설치 없이 .NET 클라이언트 프로그램 배포하는 방법 [6]파일 다운로드2
821정성태1/1/201050782개발 환경 구성: 62. .NET 응용 프로그램에서 Oracle XE 사용 [1]
820정성태12/29/200922329개발 환경 구성: 61. Oxite 소스 코드를 Visual Studio 2010으로 마이그레이션파일 다운로드1
818정성태12/27/200920871개발 환경 구성: 60. Cassini 서버를 localhost 이외의 주소에서 접근하도록 변경
817정성태12/21/200922444개발 환경 구성: 59. WebDev 2.0에서 실행하는 Pet Shop 4.0
816정성태12/19/200924113개발 환경 구성: 58. Pet Shop 4.0을 IIS 없이 실행하는 방법 [1]파일 다운로드1
815정성태12/18/200927015개발 환경 구성: 57. Pet Shop 4.0 - SQL Server Compact Edition Version - 두 번째 이야기파일 다운로드1
814정성태12/16/200922184오류 유형: 91. VS2010 beta2 - The application cannot start
812정성태12/11/200925985개발 환경 구성: 56. Pet Shop 4.0 - SQL Server Compact Edition Version파일 다운로드2
811정성태12/2/200939855.NET Framework: 169. [in, out] 배열을 C#에서 C/C++로 넘기는 방법 - 두 번째 이야기 [8]파일 다운로드2
810정성태12/1/200936008.NET Framework: 168. [in,out] 배열을 C#에서 C/C++로 넘기는 방법 [3]
809정성태11/27/200925671오류 유형: 90. Method not found: 'Void System.Reflection.Emit.DynamicMethod..ctor(System.String, System.Type, System.Type[])'.
808정성태11/26/200934668VC++: 38. X64 빌드 오류: error LNK2001: unresolved external symbol [COMDLL]_ProxyFileInfo
807정성태11/23/200928511웹: 14. 로컬에 있는 HTML 페이지를 보호 모드에서 여는 방법
... 166  167  168  [169]  170  171  172  173  174  175  176  177  178  179  180  ...