1. 程式人生 > >######業務儘可能用sql實現(縮短後臺響應時間):最近都在優化之前的程式碼:發現每個模組的index頁都需要優化(很多都在迴圈裡操作資料庫:菜!初級!)

######業務儘可能用sql實現(縮短後臺響應時間):最近都在優化之前的程式碼:發現每個模組的index頁都需要優化(很多都在迴圈裡操作資料庫:菜!初級!)

 

###最近都在優化之前的程式碼:

發現每個模組的index頁都需要優化(很多都再迴圈裡操作資料庫:菜!初級!或者說趕專案沒想優化這回事吧)

===》解耦合前提下,能用一條SQL解決的,多測試寫SQL。可以減少很多程式碼。

希望我在疲憊,腦子不好使時候也能堅持吧。(注意休息,保持腦子好使!哈哈)

===》兩次版本:

程式碼:

 /**
     * 版本2:
     * 媒體列表 顯示優化。一條SQL。減少請求響應時間。
     * 定義一個VOMap。
     * */
    @Override
    public List<MediaVO> selectAll() {  //列表頁:VO。====新建媒體,選擇 incomWay,模仿User選 Role。
        List<MediaVO> mediaVOList = ccMediaDOMapper.selectAll();  //推廣渠道:字典表,SQL
        return mediaVOList;
    }
/*
//        版本一:(背景:需求變動:新增需求:媒體要顯示:媒體下廣告位數目。)
//        為了省事。沒有考慮效率。直接遍歷List<mediaDO>根據mediaId查詢廣告位數目。
//        迴圈裡操作資料庫。導致響應請求很慢。。。
    @Override
    public List<MediaVO> selectAll() {  //列表頁:VO。====新建媒體,選擇 incomWay,模仿User選 Role。

        List<MediaDTO> mediaDTOList = ccMediaDOMapper.selectAll();  //推廣渠道:字典表,SQL
        ArrayList<MediaVO> mediaVOList = new ArrayList<>();
        ArrayList<Integer> mediaIdList = new ArrayList<>();
        for (MediaDTO mediaDTO:mediaDTOList) {

            MediaVO mediaVO = new MediaVO();
            //===========屬性賦值:
            DozerBeanMapper dozer = new DozerBeanMapper();
            dozer.map(mediaDTO, mediaVO);//取代手動set。
            mediaVOList.add(mediaVO);//====》VO沒有slotCount屬性值。

            Integer mediaDTOId = mediaDTO.getId();
            mediaIdList.add(mediaDTOId);
        }
//        ArrayList<MediaVO> slotCountList = ccAdslotDOMapper.getSlotCountListByMediaIdList(mediaIdList);
        List<Map<String,Integer > > slotCountMapList = ccAdslotDOMapper.getSlotCountListByMediaIdList(mediaIdList);
        for(int i = 0;i<slotCountMapList.size();i++){
            Map<String,Integer > slotCountMapThis = slotCountMapList.get(i);
            Integer mediaIdmap = slotCountMapThis.get("mediaId");
            Integer slotCount = slotCountMapThis.get("slotCount");
            for(int j = 0;j<mediaDTOList.size();j++) {

//                if (mediaIdmap.intValue() ==  ){  判斷匹配。效率低。首先用SQL。。。slotCountMapList
//
//                }
            }

        }

        return mediaVOList;
    }
*/

SQL:之前版本就是簡單關聯使用者表。基本上就是查詢media基本資訊的SQL難度級別。

  <select id="selectAll" resultMap="MediaVOMAP">
/** 別指望一次寫出來:腦子線上,反覆嘗試。才寫出來的這個SQL。腦子不線上,乾脆去休息。 */
    SELECT result_media.*,
    COUNT(result_media.slotId) adslot_amount,
    u1.login_name creator_name,
    u2.login_name updater_name
    FROM (
    SELECT
--     admin_media.*
    <include refid="Base_Column_List" />,
    -- ,COUNT(result.id) adslot_amount
    admin_adslot.id AS slotId
    FROM admin_media
    /** 不可用INNER,要有無廣告位都要查出媒體 */
    LEFT  JOIN admin_adslot ON admin_media.id = admin_adslot.media_id AND admin_adslot.is_deleted = 0
    AND admin_media.is_deleted = 0
    ) AS result_media
    /** 必須INNER,媒體必須要顯示更新者和建立者 */
    INNER  JOIN sys_user u1 ON result_media.`user_id` = u1.id AND u1.is_deleted = 0
    INNER  JOIN sys_user u2 ON result_media.`user_id_update` = u2.id AND u2.is_deleted = 0

    GROUP BY result_media.id

  </select>
  <!--
  不行。
  <select id="selectAll" resultMap="MediaVOMAP">
    select
    <include refid="Base_Column_List" />,

    u1.login_name creator_name,
    u2.login_name updater_name,
    COUNT(admin_adslot.id) adslot_amount
    FROM admin_media
    INNER  JOIN sys_user u1 ON admin_media.`user_id` = u1.id AND u1.is_deleted = 0
    INNER  JOIN sys_user u2 ON admin_media.`user_id_update` = u2.id AND u2.is_deleted = 0
    INNER  JOIN admin_adslot ON admin_media.id = admin_adslot.media_id AND admin_adslot.is_deleted = 0
    AND admin_media.is_deleted = 0

  </select>-->