申艳超-博客

搜索引擎、分布式、高性能、NLP、ElasticSearch、Solr

0%

为什么要使用Selenium Grid ?

  • 分布式运行大规模的Test
  • 能够通过一个中央点,很容易的运行不同OS上的不同browser
  • 最小化对Grid的维护时间,并能充分利用虚拟设备

Selenium Grid 部署与启动

Hub :总控节点,连接调用Node。
Node: 负责执行Tests,调用浏览器。

Read more »

用mysqldumpslow分析mysql的slow query log

mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf里面修改,需增加如下几行

1
2
3
long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes[这个在mysql4.10以后才被引入]

long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,我生成的log就在mysql的data目录
log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。
把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境。

Read more »

环境准备

  • Jmeter(本文以2.8为例)
  • jdk 1.5+
  • 多台机器
    (假设3台,IP分别为:10.81.14.170,10.81.14.180,10.81.14.190)

工作原理

1台机器做为总控机,其他机器作为节点机。总控机器,负责将JMX脚本分发到节点机上,各个节点同时独立运行,向服务发出压力,总控机可以获取并汇总报告。
定义:

总控机为client,我们(用户)只与这台机器打交道。或者称之为Master;
节点机器为server,它负责真正的向服务发出压力。或者称之为Slave;

Read more »

mysqldump命令用来备份数据库,默认会导出一整条insert语句,虽说执行起来会快一些。但是遇到大表,很可能因为缓冲区过载而挂掉。

mysqldump –skip-opt 加入这个参数,就可以导出多条独立的insert语句。

例如:

1
mysqldump --skip-opt -uroot -p database tablename > script.sql

定义:又叫发布订阅模式(Publish/subscribe),它定义了对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

这个定义还是比较通俗易懂的。我看了一遍,发现这不就是微博吗?我发布一条微博,那么所有关注我的人,都会收到通知,然后在新鲜事里显示出来。没错,就是这样!

观察者模式有4个角色:

  • 被观察者(Observable):
    定义被观察者必须实现的职责,动态的增加、删除观察者以及通知观察者
  • 观察者(Observer):
    接收到消息后,进行更新操作
  • 被观察者(Observable)具体类:
    定义自己的业务逻辑,并定义哪儿些事件需要通知观察者
  • 观察者(Observer)具体类:
    每个观察者在接收到消息后的更新操作是不同的。
Read more »

定义:迭代器模式提供了一种方法来访问一个容器对象种的各个元素,而又不暴露这个对象的内部细节。

在Java中已经默认提供了Iterator支持,各种容器类都进行了实现,而事实上,迭代器模式就是为了解决如何遍历这些容器里的元素而诞生的。

迭代器模式主要有以下的角色:

  • Iterator抽象迭代器:
    负责定义访问与遍历元素的接口。基本有3个固定的方法hasNext(),next(),remove();
  • Concrete Iterator具体迭代器:
    迭代器的实现类,实现接口,完成元素遍历。
  • Aggregate抽象容器:
    定义创建具体迭代器的接口。在Java种一般是iterator()方法。
  • Concrete Aggregate具体容器:
    实现创建迭代器接口,返回迭代器实例对象。
Read more »

定义:命令模式是一种高内聚的模式。它将一个请求封装成一个对象,从而让使用不同请求来把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销与恢复功能。
听起来,好复杂!

在程序员之间,流传着这样一句话:程序写到最后,就是if-else,for,while。
真是枯燥啊!其实能体会到这种感觉,说明作为一个程序员,你已经有了一定的造诣了。那如何提高呢?

试想,在代码中,你有很多if-else或者case语句。为什么有这样的语句呢?因为判断条件多啊,需要根据不同的条件来做不同的事情。2、3个条件还可以写,如果有20个条件呢,或者N多呢。那么我们的if-else那就判断N重条件,这简直是无法忍受的,写出的代码可维护性更不用说了。

Read more »

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
基本上,可以就是一个clone方法,通过这个方法进行对象的拷贝。

Java中的原型模式:

public class ProtoTypeClass implements Cloneable {

    @Override
    public ProtoTypeClass clone(){
        ProtoTypeClass cloneObject = null;
        try{
            cloneObject = (ProtoTypeClass) super.clone();
        }catch (Exception e) {
            // TODO: handle exception
        }
        return cloneObject;
    }
}

上面就是实现了原型模式。不过Java在提供了Cloneable这一接口方便实现原型模式的同时,也带来了一些不容易注意到的问题。

  • clone时,构造函数不会执行
  • 浅拷贝与深拷贝

这两个问题是需要时刻注意的。由于本文主要不是讲Cloneable,所以另辟专题吧。

定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
就是说,Facade提供了一个统一的接口,掩盖下层系统的复杂性,用户用起来更加的方便。

以医院的例子,做个比喻:

Read more »