我在 Flask 中通過(guò) uwsgi 創(chuàng)建了一個(gè) Web 服務(wù)。為了安全起見,我想我應(yīng)該遵循良好的實(shí)踐并創(chuàng)建一個(gè)具有 20 個(gè)連接的 SessionPool。每次調(diào)用 Web 服務(wù)端點(diǎn)時(shí),我都會(huì)從池中獲取一個(gè)連接,最后釋放它。當(dāng)使用 Locust 進(jìn)行群體測(cè)試 API 時(shí),我遇到了數(shù)百次失敗,在一些較長(zhǎng)的響應(yīng)(30Mb JSON 響應(yīng))上幾乎 100% 失敗。較小的有效載荷要好得多,但會(huì)出現(xiàn)間歇性故障。當(dāng)我切換回不良實(shí)踐并在方法本身內(nèi)創(chuàng)建一個(gè)新的連接和光標(biāo)時(shí),我所有的問(wèn)題都消失了。數(shù)千次壓力測(cè)試呼叫 100% 成功。我的錯(cuò)誤多種多樣。TNS 錯(cuò)誤數(shù)據(jù)包、池中連接數(shù)不正確、用戶取消請(qǐng)求......只要你能想到的,它就在那里。因此,我似乎無(wú)法將 Oracle 連接池與 Flask 一起使用,或者在 Flask 應(yīng)用程序級(jí)別上只有一個(gè)連接(這會(huì)生成錯(cuò)誤,不知道為什么,這就是我切換到連接池的原因)。有關(guān)在 Flask 中使用 cx_Oracle 創(chuàng)建可擴(kuò)展應(yīng)用程序的任何建議。我原來(lái)的代碼是:pool = cx_Oracle.SessionPool("user", "password", "myserver.company.net:1521/myservice", min=10, max=10, increment=0, getmode=cx_Oracle.SPOOL_ATTRVAL_WAIT, encoding="UTF-8")def read_products_search(search=None): """ This function responds to a request for /api/products with the complete lists of people :return: json string of list of people """ conn_ariel = pool.acquire() cursor_ariel = conn_ariel.cursor() search=search.lower() print("product search term is: ", search) # Create the list of products from our data sql = """ SELECT DRUG_PRODUCT_ID, PREFERRED_TRADE_NAME, PRODUCT_LINE, PRODUCT_TYPE, FLAG_PASSIVE, PRODUCT_NUMBER FROM DIM_DRUG_PRODUCT WHERE lower(PREFERRED_TRADE_NAME) LIKE '%' || :search1 || '%' or lower(PRODUCT_LINE) LIKE '%' || :search2 || '%' or lower(PRODUCT_NUMBER) LIKE '%' || :search3 || '%' ORDER BY PREFERRED_TRADE_NAME ASC """ cursor_ariel.execute(sql, {"search1":search,"search2":search, "search3":search }) products = [] for row in cursor_ariel.fetchall(): r = reg(cursor_ariel, row, False) product = { "drug_product_id" : r.DRUG_PRODUCT_ID, "preferred_trade_name" : r.PREFERRED_TRADE_NAME, "product_line" : r.PRODUCT_LINE, "product_type" : r.PRODUCT_TYPE, "flag_passive" : r.FLAG_PASSIVE, "product_number" : r.PRODUCT_NUMBER }
- 1 回答
- 0 關(guān)注
- 262 瀏覽
添加回答
舉報(bào)
0/150
提交
取消