NpgsqlConnector ETL的那點事

有時候我們需要調用NpgsqlConnector來完成ETL到PostgreSQL的遷移,不過會遇到一些問題,比如:在遷移數據到PostgreSQL數據庫的時候,最後一個字節一直都寫不到數據庫。

這個時候我們可以收集dump文件,從dump文件中,發現可疑的線程如下:


000000ad`b79fdea8 00007ffa`cee5cc7e
ntdll!ZwWaitForMultipleObjects+0x14 [minkernel\ntdll\daytona\objfre\amd64\usrstubs.asm @ 907] 

01 000000ad`b79fdeb0 00007ffa`b57a3a2e
KERNELBASE!WaitForMultipleObjectsEx+0xfe [minkernel\kernelbase\synch.c @
1551] 

02 000000ad`b79fe1b0 00007ffa`b57a3884
clr!WaitForMultipleObjectsEx_SO_TOLERANT+0x62 [f:\dd\ndp\clr\src\vm\threads.cpp
@ 4292] 

03 (Inline Function) --------`--------
clr!Thread::DoAppropriateAptStateWait+0x44 [f:\dd\ndp\clr\src\vm\threads.cpp
@ 4326] 

04 000000ad`b79fe210 00007ffa`b57a367d
clr!Thread::DoAppropriateWaitWorker+0x1e4 [f:\dd\ndp\clr\src\vm\threads.cpp
@ 4466] 

05 000000ad`b79fe310 00007ffa`b59015aa clr!Thread::DoAppropriateWait+0x7d
[f:\dd\ndp\clr\src\vm\threads.cpp @ 4133] 

06 000000ad`b79fe390 00007ffa`b580207f clr!CLREventBase::WaitEx+0xc4 [f:\dd\ndp\clr\src\vm\synch.cpp
@ 753] 

07 (Inline Function) --------`-------- clr!CLREventBase::Wait+0x1f [f:\dd\ndp\clr\src\vm\synch.cpp
@ 673] 

08 (Inline Function) --------`-------- clr!Thread::Wait+0x1f [f:\dd\ndp\clr\src\vm\threads.cpp
@ 4951] 

09 000000ad`b79fe420 00007ffa`b580204c clr!Thread::Block+0x27 [f:\dd\ndp\clr\src\vm\threads.cpp
@ 4908] 

0a 000000ad`b79fe450 00007ffa`b5801df1 clr!SyncBlock::Wait+0x19d [f:\dd\ndp\clr\src\vm\syncblk.cpp
@ 3561] 

0b (Inline Function) --------`-------- clr!ObjHeader::Wait+0x29 [f:\dd\ndp\clr\src\vm\syncblk.cpp
@ 2743] 

0c (Inline Function) --------`-------- clr!Object::Wait+0x29 [f:\dd\ndp\clr\src\vm\object.h
@ 541] 

0d 000000ad`b79fe590 00007ffa`b2f1bda8 clr!ObjectNative::WaitTimeout+0xe1
[f:\dd\ndp\clr\src\classlibnative\bcltype\objectnative.cpp @ 315] 

0e 000000ad`b79fe710 00007ffa`b2f1bb69
mscorlib_ni!System.Threading.SemaphoreSlim.WaitUntilCountOrTimeout(Int32,
UInt32, System.Threading.CancellationToken)+0x68 [f:\dd\ndp\clr\src\BCL\system\threading\SemaphoreSlim.cs
@ 469] 

0f
000000ad`b79fe760 00007ffa`576eeffd
mscorlib_ni!System.Threading.SemaphoreSlim.Wait(Int32, System.Threading.CancellationToken)+0x149 [f:\dd\ndp\clr\src\BCL\system\threading\SemaphoreSlim.cs
@ 383] 

10 000000ad`b79fe7f0 00007ffa`5772be1b
Npgsql!Npgsql.NpgsqlConnector.StartUserAction(Npgsql.ConnectorState)+0x4d

11 000000ad`b79fe840 00007ffa`5772b2a4
Npgsql!Npgsql.NpgsqlCommand.Prepare()+0x11b

以上的線程就是在等待SemaphoreSlim這個鎖。查看原碼:

https://github.com/npgsql/npgsql/blob/v3.1.10/src/Npgsql/NpgsqlConnector.cs

Review the code, you can see it
need to get SemaphoreSlim lock which is _keepAliveLock.

在這裏插入圖片描述

在這裏插入圖片描述
很明顯這個鎖是在keepalive enabled的情況下才去拿的,那麼去掉keep alive的配置,繼續遷移,問題搞定!

在這裏插入圖片描述

發佈了13 篇原創文章 · 獲贊 0 · 訪問量 965
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章