業務場景:我們有一個介面提高給第三方呼叫,每天呼叫頻率在500W+次以上,需要回傳一個基于
oracle序列自增產生的id給第三方,(該id后面給一張關聯表作為主鍵id)
優化前代碼邏輯:
每次第三方呼叫介面便執行一次資料庫查詢操作
seelct seqName..nextval from dual
優化后
第一步,設定一個佇列
private static LinkedBlockingQueue<String> linkedBlockingBatchMsgIdQueue = new LinkedBlockingQueue<String>(10000);
第二步,一次性生成500至1000個id
select seqName.nextval as msgid from (select 1 from all_objects where rownum <= ? )
-- rownum 可以經過壓力測驗,基于資料庫得出一個最佳值 我這邊配置為 1000 呼叫一次耗時在50毫秒左右
獲取完成之后回圈存入linkedBlockingBatchMsgIdQueue 中
第三步,佇列中獲取id
linkedBlockingBatchMsgIdQueue.poll()
其他方案
使用redis自增id,這樣效率更高高,考慮我們存在多個組件都需要這個序列,基于現有的業務必須要做一個同步,經過綜合考慮,采用佇列的方式來優化大批量獲取資料庫序列
uj5u.com熱心網友回復:
感謝分享!
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/6832.html
標籤:開發
上一篇:使用觸發器阻止洗掉表
