使用mysql_udf與curl庫完成http_post通信模塊(mysql_udf,multi_curl,http,post)
這個(gè)模塊其目前主要用于xoyo江湖的sns與kingsoft_xoyo自主研發(fā)的TCSQL數(shù)據(jù)庫做數(shù)據(jù)同步,當(dāng)有feed插入sns數(shù)據(jù)庫,使用觸 發(fā)器調(diào)用該模塊,向tcsql數(shù)據(jù)庫發(fā)送同步數(shù)據(jù)。也可以使用該模塊與其它使用socket接口的數(shù)據(jù)庫或程序做轉(zhuǎn)發(fā)與同步。
http_post模塊主要使用mysql_udf接口,與curl庫兩部分技術(shù)。
mysql_udf是mysql為c語言提供的一個(gè)接口,通過這個(gè)接口,用戶可以自定義mysql的函數(shù),通過調(diào)用這些mysql函數(shù),調(diào)用相應(yīng)的c語言 模塊來執(zhí)行特定功能,實(shí)現(xiàn)mysql數(shù)據(jù)與外部應(yīng)用的交互。curl庫是一個(gè)比較常用的應(yīng)用層網(wǎng)絡(luò)協(xié)議庫,主要用到的是其中的curl_multi異步通 信api,用來進(jìn)行網(wǎng)絡(luò)傳輸。
首先參考mysql官方提供的udf_example.c文件,建立3個(gè)主要的接口函數(shù),分別是初始化函數(shù),執(zhí)行函數(shù)與析構(gòu)函數(shù)。
在mysql_udf接口中,主函數(shù)體中是不允許使用new或malloc動態(tài)分配內(nèi)存,所以如果需要申請內(nèi)存空間,必須用xxxx_init()函數(shù)申 請并將申請的地址賦給initid->ptr指針,然后在主函數(shù)體中使用,并在xxxx_deinit析構(gòu)函數(shù)體中釋放。另外對于 mysql_udf接口的調(diào)用好像當(dāng)并發(fā)量超過一定程度,如果是使用動態(tài)分配內(nèi)存,會出現(xiàn)double free的錯誤,為了避免這個(gè)錯誤,所以在我的程序里使用靜態(tài)空間與動態(tài)申請空間相結(jié)合的方式,這樣如果數(shù)據(jù)較小,并發(fā)量較大,不會出現(xiàn)double free錯誤。對于靜態(tài)申請空間,最大約在160000~170000byte左右,我這里使用的160000,當(dāng)mysql傳送的數(shù)據(jù)大于這個(gè)數(shù)的時(shí) 候,才動態(tài)申請內(nèi)存。初始化函數(shù)體如下: