Go語言的MySQL庫

jopen 10年前發布 | 30K 次閱讀 Go語言 Google Go/Golang開發

先介紹一下這個庫的由來。

之前在項目中用的MySQL庫是從vitess項目里摳出來用的,當初項目剛開始的時候Go才剛正式發布,沒太多選擇,當時比較不放心用Go重新封 裝MySQL通訊協議的庫,感覺很容易有BUG,并且代碼量很大,一旦出問題自己很難填坑,當時對MySQL的API以及CGO都不了解,也沒有太多時間 邊看文檔邊封裝,正好朋友推薦了vitess里面用CGO包裝的MySQL庫,跟純用Go實現的MySQL庫對比了一下,首先是代碼非常少(容易駕馭), 其次是加載數據的性能對比中,比純用Go的庫速度快了不少,于是就愉快的決定用它了。再后來因為項目需要,組里的兄弟往里面加了prepare語句的支 持,但是因為項目只用到非查詢語句,所以prepare語句也就沒支持結果集的返回。

隨著自己對CGO和MySQL API的深入了解,發現最初用的vitess庫的CGO用法不是很合理,其中CGO調用很瑣碎,就像沒有調用代價一樣,但實際上CGO調用是要比普通函數 調用開銷大很多的,其次是MySQL API有要求在不同線程中使用前要先調用mysql_thread_init函數初始化一下,而CGO的特性是每次調用不一定在固定的線程中執行,所以變 成每次CGO調用MySQL API前都要先執行mysql_thread_init,后來我跑去github上看新版vitess的代碼,發現他們已經把這兩個問題都改善了,首先是 把多次CGO調用包裝成一個C函數一次調用,其次是在每個包裝好的C函數開頭都會調用mysql_thread_init。

于是我就重新把新版vitess庫里面的代碼抽取出來,再加上之前項目里用到的prepare功能,新做了一個庫。詳見:http://github.com/funny/mysql

本想這樣就好了,但是看著那API越看越別扭,于是上周末在機場等飛機時(延誤了將近7個小時。。。)新開了一個庫(坑),詳見:http://github.com/funny/oursql

新的庫(坑)把結果集抽象成了三種:Result(非查詢)、DataTable(查詢并取回本地)、DataReader(查詢并返回游標),感覺API清晰很多,并且去掉了很多用不到的類型轉換,代碼很少繼承關系很清楚,頓時覺得一切皆在掌控之中了。

后來想,prepare只支持非查詢的話感覺很low啊,于是繼續給自己挖坑(當時還不覺得),往里面加prepare語句的查詢結果集返回。這個 坑一挖下去,整個人都要累覺不愛了,prepare的結果集返回原來跟普通語句執行的結果集返回相差非常大,從獲取數據的流程到返回的數據類型,都相差很 多。

硬著頭皮填了兩天,終于算是填上了,結果集還是保持Result、DataTable、DataReader三種,從庫的內部隱藏實現細節,調用者(你)就不用管我到底廢了多少心機死了多少腦細胞了。

來自:http://1234n.com/?post/rw1w5v

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!