Shopnc Model底層隱藏的坑

来源:http://www.cnblogs.com/wangyulu/archive/2016/01/31/5173580.html
-Advertisement-
Play Games

前段時間實現某一個功能,涉及到對數據表的查詢操作,經本地與測試環境測試過後都沒問題,這一過程貌似都很順利,想想是不是要下班了啦(雖然時間好像也不早了),接著推入正式環境下進行最後的測試(心想應該不會有什麼問題吧,畢竟就只是對數據的查詢,而且都已經測試過了,數據也完好的輸出);


前段時間實現某一個功能,涉及到對數據表的查詢操作,經本地與測試環境測試過後都沒問題,這一過程貌似都很順利,想想是不是要下班了啦(雖然時間好像也不早了),接著推入正式環境下進行最後的測試(心想應該不會有什麼問題吧,畢竟就只是對數據的查詢,而且都已經測試過了,數據也完好的輸出)


最後….終於還是意想不到的事情發生了。。。

產品那邊說為何為何這麼慢,數據載入不出來。。。


根據產品那邊的反饋,我看了看相關程式,覺得應該沒問題呀,再看看表欄位設計,發現了我加的那幾個欄位有的應該要加上索引的但我沒加,加上去了,測試下還是幾乎一樣慢,幾乎數據載入不來。。。


再看了看測試環境下的一些配置文件與正式環境下的配置對比,也沒發現什麼問題呀,


找問題。。。。

(這時思維貌似是陷進了某個死角。。)

 

經過主管的細心排查終於發現問題出現在哪裡了。。。


原來是Model底層有個包含所有表名其主鍵的一個緩存文件搞的鬼(好像是程式執行時沒載入到進行,或者保存的時候沒保存成功到該緩存文件),導致程式每一次涉及到對錶的操作是都是重新去伺服器里去查詢所有表,想想多可怕啊。。。


總結這個事情反應出了以下問題:

1.程式方面的邏輯判斷不夠嚴謹!

體現在如果以上的那個緩存文件載入失敗,或者數據保存到緩存文件不成功,在日誌里能夠體現出來,那是不是定位問題所產生的原因是不是更快、更精準了!


2.排查問題的思維方式太過於局限性!

貌似總是在一個層面上去思考問題,很難跳出當前的思維模式站在其它的角度去思考問題,這可能是自身的問題!(思維不夠靈活,或者說經驗不足)


3.對系統底層框架的實現原理不夠深入!

可能在日常的開發中比較繁忙,我們只是停留在使用某一個方法,並沒有去深入瞭解它的底層實現原理,

這樣的話出現問題了,搞的就比較被動!


對於以上總結可能還遠遠不夠,但重要的是一定要去閱讀源代碼!

 

代碼片段:

/**
     * 生成表結構信息
     *
     * @param string $table
     * @return
     */
    public function tableInfo($table)
    {
        if (empty($table))
            return false;
        //只取主鍵,find(2)等自動匹配主鍵時使用
        if (file_exists(BASE_DATA_PATH . '/cache/fields/_pk.php')) {
            $this->fields = require(BASE_DATA_PATH . '/cache/fields/_pk.php');
        } else {
            $full_table = Db::showTables();
            $_pk_array = array();
            $count = strlen(C('tablepre'));
            foreach ($full_table as $v_table) {
                $v = array_values($v_table);
                if (substr($v[0], 0, $count) != C('tablepre'))
                    continue;
                $tb = str_replace(C('tablepre'), '', $v[0]);
                $fields = DB::showColumns($tb);
                foreach ((array) $fields as $k => $v) {
                    if ($v['primary']) {
                        $_pk_array[$tb] = $k;
                        break;
                    }
                }
            }
            $this->fields = $_pk_array;
            F('_pk', $_pk_array, 'cache/fields');
        }
        return $this->fields[$table];
    }

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先申明下,本文為筆者學習《OpenGL ES應用開發實踐指南(Android捲)》的筆記,涉及的代碼均出自原書,如有需要,請到原書指定源碼地址下載。 《OpenGL ES學習筆記(二)——平滑著色、自適應寬高及三維圖像生成》中闡述的平滑著色、自適應寬高是為了實現在移動端模擬真實場景採用的方法,並且...
  • 【原】AFNetworking源碼閱讀(五) 本文轉載請註明出處 —— polobymulberry-博客園 1. 前言 上一篇中提及到了Multipart Request的構建方法- [AFHTTPRequestSerializer multipartFormRequestWithMethod:U
  • 這一篇主要介紹使用AFN如何訪問HTTPS網站以及這些做法的實現原理,還有介紹AFN的網路狀態監測部分AFNetworkReachabilityManager,這個模塊會和蘋果官方發Reachability框架做一個對比。 本文所有的代碼都運行在iOS9.2的模擬器上,並且在info.plist對A
  • 本文節選自《Android Studio實用指南》 第4章第27節 作者: 畢小朋 目前本書已上傳到百度閱讀, 在百度中搜索[Anroid Studio實用指南]便可以找到本書. 什麼是演示模式? 顧名思義,當你想給別人演示你的代碼時就會用到這個演示模式. 演示模式的特點就是全屏,開啟免打擾模式,
  • <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_
  • 如圖是效果圖 我用的是SlidingMenu-master框架來實現的 左邊的是側滑界面是一個fragment,右邊是一個主界面fragment,在主界面中用的是一個ViewPager來進行切換,自定義個NoScrollViewPager(不能左右劃的ViewPager) 如下是主界面的代碼 pac
  • 本文將從四個方面對IOS開發中JSON格式數據的生成與解析進行講解: 一、JSON是什麼? 二、我們為什麼要用JSON格式的數據? 三、如何生成JSON格式的數據? 四、如何解析JSON格式的數據? JSON格式取代了xml給網路傳輸帶來了很大的便利,但是卻沒有了xml的一目瞭然,尤其是json數據
  • 函數SUBSTRING: 1、從左開始截取字元串 left(str, length) 說明:left(被截取欄位,截取長度) 例:select left(content,200) as abstract from my_content_t 2、從右開始截取字元串 right(str, length)
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...