`
#rethink#
  • 浏览: 46929 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

使用static来避免“重复读”

阅读更多
在较复杂的web程序开发中,由于采用面向对象的数据操作方式,或者业务逻辑太过复杂,开发人员在开发过程中,经常会无意识的重复读取数据。
比如:
$result1 = tableobjectPeer::getResult($var1,$var2,$var3);
开发人员在需要的该table数据的时候,经常直接调用 tableobjectPeer::getResult方法。
又或者程序在进行forward()的时候,也会导致重复调用  tableobjectPeer::getResult 方法,导致“重复读”。

要避免类似的“重复读”,最主要的办法是,开发人员在代码开发的时候,就要有“避免重复读”的意识。
其实只要在:
$result1 = tableobjectPeer::getResult($var1,$var2,$var3);
之后,需要的地方进行
$result2 = $result1;
$result3 = $result1;
即可。这样子就可以避免掉大量的“重复读”了。
但是如果开放人员一开始没有这样做,那要进行这方面的重构可能是很大的工作量。
另外,由于框架中的forward()也容易造成“重复读”。如果“重复读”是forward()造成的,那该方法就不可行了(这点也许和不同的开发语言,不同的开发框架有关,在php的symfony框架中是如此)。

因此,在采用上面的方法进行优化的同时,对于一些较复杂的情况,决定采用另一种方式:使用static,设置变量为静态变量,来避免重复读取数据

示例代码如下:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?php
//要改写的函数也请加上$is_static=1变量,用来控制是否开启 static。
function staticFunc ($var1,$var2,$var3,$is_static=1)
{
    
if ( $is_static == 1 )//默认需要缓存函数结果
    {
        
static $result_array;//该数组用来保存函数的结果,支持不同参数的结果缓存
        $vars_string = serializefunc_get_args() );

        
if ( empty$result_array ) )//第一次运行需要初始化
        {
            
$result_array = array();
        }

        
if ( array_key_exists$vars_string, $result_array ) )//参数已经存在
        {
            
return $result_array[$vars_string];//返回静态变量中已经保存的结果
        }else//参数不存在
        {
            
$result_array[$vars_string= '';//后面会把结果补充进来
        }
    }
else//不利用static 缓冲结果
    {
        
if ( empty$result_array ) )
        {
            
$result_array = array();
        }
    }

    
$result_array[$vars_string= rand();//获取结果,请把获取的代码放在此处即可
    return $result_array[$vars_string];
}

echo staticFunc(1,2,3);
echo "<br>";
echo staticFunc(2,2,2);
echo "<br>";
echo staticFunc(1,2,3);
echo "<br>";
echo staticFunc(2,2,2);
echo "<br>";
echo staticFunc(3,3,3);
echo "<br>";
echo staticFunc(3,3,3,0);
echo "<br>";
?> 
运行上述代码,产生的结果类似:
16667
8888
16667
8888
2193
1014
可以看出,第1行和第3行的结果一致,第2行和第4行的结果一致,说明只要函数的参数相同,函数结果就进行了有效的“cache”。
从第4行和第5行,可以看出,通过设置$is_static变量能有效控制是否开启“cache”。

补充:上述使用static方法,可以有效的避免在一个线程内,重复读取数据,但是该cache只存在一个线程内,不同线程是相互独立的。虽然只是线程内的函数结果“cache”,但是其原理和其他方式的cache是类似的,就是要针对不同的参数(不同的情况)构造出cache的key。
分享到:
评论

相关推荐

    Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法

    `ByteArrayOutputStream` 和 `ByteArrayInputStream` 是Java IO包中用于在内存中处理字节流的两个重要类,它们可以帮助我们避免频繁读取配置文件,提高程序性能。 `ByteArrayOutputStream` 是一个输出流,它将数据...

    MySql练习7:使用事务完成存款或取款业务.zip

    在银行系统中,通常选择较高的隔离级别,如可重复读或串行化,以避免脏读、不可重复读和幻读等问题。 接下来,我们来看看如何使用Java的JDBC API来操作MySQL事务。在Java中,`Connection`对象提供了`setAutoCommit...

    提高C#编程水平不可不读的50个要诀

    37. **遵循.NET标准库**:熟悉并充分利用.NET标准库的功能,可以避免重复发明轮子,提高开发效率和代码质量。 38. **数据绑定(DataBinding)**:掌握数据绑定技术,可以简化UI与业务逻辑的交互,提高用户界面的...

    java简答题总结pdf文档

    1. 尽可能的避免使用嵌套查询,尽量使用联查 2. 查询语句中不要使用 * 3. 建立索引 第8题:索引失效 索引失效可能的原因包括: 1. 在where子句中对字段进行null值判断 2. 在where子句中使用 !=操作符 3. 在where...

    <<编程修养>>

    - **代码复用**:避免重复代码,将相似代码抽象为函数或宏。 - **括号使用**:正确使用括号以确保运算顺序,避免误解。 - **const关键字**:利用const限定函数参数,提高代码安全性。 - **函数参数**:控制函数参数...

    C&C++编程规范(软通_华为_谷歌)

    6. **头文件**:头文件包含应避免循环引用,使用条件包含保护防止重复包含。 7. **源码组织**:代码结构清晰,每个源文件只包含一个实现,相关的声明和定义放在一起。 谷歌的C++编程规范则更加强调现代化的编程...

    java并发访问重复请求过滤问题

    Java 并发访问重复请求过滤问题 Java 并发访问重复请求过滤问题...通过使用注解@NotDuplicate标记需要过滤重复请求的方法,然后使用AOP拦截这些方法,检查是否已经执行过相同的请求,从而避免了重复的请求和数据错误。

    什么是好的程序员 编程修养 word

    7. **头文件保护**:在头文件中使用#ifndef避免重复包含。 8. **内存管理**:合理使用堆内存,避免内存泄漏。 9. **变量初始化**:确保所有变量在使用前已被初始化。 10. **源文件组织**:正确使用.h和.c文件,分离...

    java编程规范

    这段代码可以通过逻辑优化来避免重复的条件检查,提高代码效率。 **2. 常量定义:** - 使用`public static final`声明常量,确保其不可修改性。例如: ```java public class A { public static final String S...

    总结最近MySQL面试题大全

    - **读已提交**(READ COMMITTED):每次读取都是事务开始时的一致性视图,无法避免不可重复读。 - **可重复读**(REPEATABLE READ):在同一事务内多次读取同一数据始终一致,防止不可重复读,但可能出现幻读。 ...

    最全MySQL面试60题和答案

    - **Repeatable Read**:可重读,避免脏读和不可重复读,但可能出现幻读。 - **Serializable**:串行化,完全避免并发问题,但性能最低。 5. **CHAR和VARCHAR的区别**: - CHAR是定长字符串,存储时用空格填充到...

    C#关于事务的使用和源代码

    - 隔离性(Isolation):事务之间是隔离的,彼此不受影响,防止脏读、不可重复读和幻读。 - 持久性(Durability):一旦事务提交,其结果将是永久的,即使系统崩溃也会保留。 3. **事务的四种隔离级别**: - 读...

    编程修养 给编程初学者看的

    - **代码复用**:避免重复代码,将相似代码抽象成函数或宏。 - **括号使用**:明确表达式优先级,使用括号确保计算的准确性。 - **const修饰符**:使用const限定参数,表明其不可变性。 - **函数参数数量**:避免...

    编程修养(程序员需要注意的关于编程的注意事项)

    - **代码复用**:避免重复代码,将相似代码抽象成函数或宏。 - **表达式括号**:使用括号明确运算优先级,防止误解。 - **const关键字**:利用const限定参数,防止意外修改。 - **函数参数数量**:合理控制函数参数...

    C++改善程序的一些方法

    37. **遵循DRY(Don't Repeat Yourself)原则**:避免重复的代码,提取公共部分为函数或类。 38. **编写文档**:良好的注释和文档能帮助他人理解和维护代码。 39. **设计模式**:了解并合理使用设计模式,如工厂...

    编程修养-陈皓-C\C++

    23. **static的使用**:合理利用static修饰局部变量,控制作用域。 24. **函数代码尺寸**:保持函数规模适度,提高代码可读性。 25. **typedef的使用**:简化类型名称,增强代码可读性。 26. **为常量声明宏**:使用...

    编程的修养1、有专研精神,勤学善问、举一反三。

    - **代码复用**:避免重复代码,将相似代码抽象为函数或宏。 - **表达式括号**:使用括号明确运算优先级,减少歧义。 - **const关键字**:合理使用const修饰函数参数,保证不变性。 - **函数设计**:明确函数参数...

    c++coding standards

    使用`static_cast`等显式转换来控制类型转换。 6. **模板**:合理使用模板可以提高代码复用性,但过度使用可能导致编译器生成大量代码,影响性能。理解模板元编程和STL容器、算法的使用。 7. **RAII(Resource ...

    Java 中少为人知的小点子

    Java 中少为人知的小点子 ...这样,我们可以避免大量的代码重复和Copy&Paste。 Java 中少为人知的小点子可以帮助我们编写更加简洁、易读和高效的代码。它们可以帮助我们解决一些常见的问题,并提高我们的编程效率。

    Effective C++

    33. **使用static_assert进行静态断言**:在编译时检查条件,避免运行时错误。 34. **理解并使用多态**:通过虚函数和抽象基类实现多态,设计可扩展的软件结构。 35. **使用纯虚函数创建抽象类**:纯虚函数使得类...

Global site tag (gtag.js) - Google Analytics