MySql性能监控
用mysqldumpslow分析mysql的slow query log
mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf里面修改,需增加如下几行
1 | long_query_time = 1 |
long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name-slow.log,我生成的log就在mysql的data目录
log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。
把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境。
从源码编译构建Jmeter
获取Jmeter的源码
Jmeter源码可以从SVN REPO找到,地址:http://svn.apache.org/repos/asf/jmeter/trunk/
从GIT上也是可以的。地址:https://github.com/apache/jmeter
Git clone:
1 | git clone git://github.com/apache/jmeter.git jmeter |
这样就把Jmeter的源码给放到了本地的jmeter文件夹内。
配置并编译Jmeter
jmeter 分布式 step by step
mysqldump命令使用
mysqldump命令用来备份数据库,默认会导出一整条insert语句,虽说执行起来会快一些。但是遇到大表,很可能因为缓冲区过载而挂掉。
mysqldump –skip-opt 加入这个参数,就可以导出多条独立的insert语句。
例如:
1 | mysqldump --skip-opt -uroot -p database tablename > script.sql |
设计模式:观察者(Observer) in java
定义:又叫发布订阅模式(Publish/subscribe),它定义了对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
这个定义还是比较通俗易懂的。我看了一遍,发现这不就是微博吗?我发布一条微博,那么所有关注我的人,都会收到通知,然后在新鲜事里显示出来。没错,就是这样!
观察者模式有4个角色:
- 被观察者(Observable):
定义被观察者必须实现的职责,动态的增加、删除观察者以及通知观察者 - 观察者(Observer):
接收到消息后,进行更新操作 - 被观察者(Observable)具体类:
定义自己的业务逻辑,并定义哪儿些事件需要通知观察者 - 观察者(Observer)具体类:
每个观察者在接收到消息后的更新操作是不同的。
设计模式:迭代器(Iterator) in java
定义:迭代器模式提供了一种方法来访问一个容器对象种的各个元素,而又不暴露这个对象的内部细节。
在Java中已经默认提供了Iterator支持,各种容器类都进行了实现,而事实上,迭代器模式就是为了解决如何遍历这些容器里的元素而诞生的。
迭代器模式主要有以下的角色:
- Iterator抽象迭代器:
负责定义访问与遍历元素的接口。基本有3个固定的方法hasNext()
,next()
,remove()
; - Concrete Iterator具体迭代器:
迭代器的实现类,实现接口,完成元素遍历。 - Aggregate抽象容器:
定义创建具体迭代器的接口。在Java种一般是iterator()
方法。 - Concrete Aggregate具体容器:
实现创建迭代器接口,返回迭代器实例对象。
设计模式:命令(Command) in java
定义:命令模式是一种高内聚的模式。它将一个请求封装成一个对象,从而让使用不同请求来把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销与恢复功能。
听起来,好复杂!
在程序员之间,流传着这样一句话:程序写到最后,就是if-else,for,while。
真是枯燥啊!其实能体会到这种感觉,说明作为一个程序员,你已经有了一定的造诣了。那如何提高呢?
试想,在代码中,你有很多if-else或者case语句。为什么有这样的语句呢?因为判断条件多啊,需要根据不同的条件来做不同的事情。2、3个条件还可以写,如果有20个条件呢,或者N多呢。那么我们的if-else那就判断N重条件,这简直是无法忍受的,写出的代码可维护性更不用说了。
设计模式:原型(prototype) in java
定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
基本上,可以就是一个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) in java
定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
就是说,Facade提供了一个统一的接口,掩盖下层系统的复杂性,用户用起来更加的方便。
以医院的例子,做个比喻: