Shopnc Model底层隐藏的坑

前段时间实现某一个功能,涉及到对数据表的查询操作,经本地与测试环境测试过后都没问题,这一过程貌似都很顺利,想想是不是要下班了啦(虽然时间好像也不早了),接着推入正式环境下进行最后的测试(心想应该不会有什么问题吧,毕竟就只是对数据的查询,而且都已经测试过了,数据也完好的输出);

最后….终于还是意想不到的事情发生了。。。

产品那边说为何为何这么慢,数据加载不出来。。。

根据产品那边的反馈,我看了看相关程序,觉得应该没问题呀,再看看表字段设计,发现了我加的那几个字段有的应该要加上索引的但我没加,加上去了,测试下还是几乎一样慢,几乎数据加载不来。。。

再看了看测试环境下的一些配置文件与正式环境下的配置对比,也没发现什么问题呀,

找问题。。。。

(这时思维貌似是陷进了某个死角。。)

经过主管的细心排查终于发现问题出现在哪里了。。。

原来是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];
    }

  

时间: 2024-12-16 20:37:18

Shopnc Model底层隐藏的坑的相关文章

Web---myAjax(自己写底层)-隐藏帧技术

讲解网站一般都有的一个功能,就是注册时候的,实现验证用户名是否存在的功能. 源代码演示: reg.jsp: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <

self.***和_***的区别及隐藏毛坑 待续

@property(nonatomic,assign) long processingOrderId; 在单例中的.h头文件中声明的非对象指针,要用_processingOrderId不要用self.processingOrderId,不然可能出现稀奇古怪的情况. .h头文件中不声明orderId,在.m文件中有-(void)setOrderId:(long)orderId,在调用initData时会调用setOrderId:(long)orderId,编译器不报错的异常情况. -(void)i

MVC中model binding的坑

这两天发现一个model binding中的坑,就是action中的参数名不能和属性重复,否则绑定不了,参数始终是null, 举例说明: T_Account类定义如下 public partial class T_Account { [Key] public int Id { get; set; } [Required] [StringLength(50)] public string Account { get; set; } [StringLength(50)] public string

TCP/IP详解卷二——开坑记

最近我一直在读Gary R. Wright和W. Richard Stevens合著的TCP/IP详解卷二,深感Net/3版本协议栈实现的繁杂.本来打算看完书本,再看下陈硕大大写的基于TUN/TAP虚拟网卡Net/3移植版(他的版本是ip层以及下层实现都由虚拟网卡提供),再自己撸个简化版的用户态协议栈,之后抽空再看看UNIX网络编程卷一(全是api应用,有隐藏的坑),算是对计算机网络基础一个完整的学习(当然,再后面就是阅读各种开源代码).可是,这TCP/IP详解卷二真是够繁杂的,其实繁杂倒也无所

Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究

在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听/监控方法做一些总结,以备后用. 一.点击空白处隐藏软键盘 这是具有编辑框焦点的页面对输入法软键盘状态监听的一般需求和解决方法. 首先获得InputMethodManager:        InputMethodManager manager = (InputMethodManager) getS

js 面试的坑

判断页面滚动方向(上下) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> body{ height:1000px; } </style> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"

MVC传递Model之TempData、ViewData、ViewBag区别及用途

MVC使用过程中经常会用到TempData.ViewData.ViewBag三种方式,这三种什么区别呢? TempData:默认存储于Session中,可通过继承ITempDataProvider接口改变, 生命周期:经过一次Controller传递就失效,即View读取一次后对应的TempData即从TempData集合中删除,不过如果TempData未被View读取之前,其值可在Controller之间传递.PS:如果你不想TempData使用后就删除,您可以通过TempData.Peek(

Bootstrap的Model源码详细注释

工作中用到了Bootstrap的Model这个插件,想封装下,然后看了下源码不多,于是读了下源码并注释了下. 后端狗,前端不熟,注释的不好,请务必指出. /* ========================================================================  * Bootstrap: modal.js v3.2.0  * http://getbootstrap.com/javascript/#modals  * ==================

Bootstrap的Model源码详细注释 (转)

原文: http://my.oschina.net/haogrgr/blog/323079?p=1 /* ======================================================================== * Bootstrap: modal.js v3.2.0 * http://getbootstrap.com/javascript/#modals * ================================================