一个简单接口的优化分析与实战
2015-03-30 20:01
295 查看
背景:因为数据量稍大以及查询中含有三个表连接操作,导致查询时间超过6秒,前端发送请求,通过Nginx服务器进行转发,因为查询速度过慢导致Nginx转发失败,返回499错去(Nginx内部机制还是默认配置?),客户端关闭连接,无法得到返回值。
想到的解决方法:
1. Nginx服务扩容(比较low,而且也无法从根本上解决问题)
2. 分析Mysql执行计划,给相应字段添加索引(这是必须的,前期索引没添加属于低级失误),查询速度提高一倍,但3秒还是不够快,Nginx依旧转发失败
3. 代码加入分页功能,比如一次加载20行(还是没能解决问题)
4. 对三次表连接操作进行分拆,单独查询出每个表的值,然后在Java代码中进行分类与归并(对代码改动较大,还未尝试)
5. 利用loadingcache进行内存缓存,来自google guava。样例代码如下:
public static LoadingCache<String, List<GeneralSelfDefineEventDisDomain>> cache = null;
static {
cache = CacheBuilder
.newBuilder()
// 设置大小,条目数
.maximumSize(10000)
// 设置时效时间,最后一次被访问
.expireAfterAccess(2, TimeUnit.HOURS)
// 移除缓存的监听器
.removalListener(
new RemovalListener<String, List<GeneralSelfDefineEventDisDomain>>() {
public void onRemoval(
RemovalNotification<String, List<GeneralSelfDefineEventDisDomain>> notification) {
}
})
// 缓存构建的回调
.build(new CacheLoader<String, List<GeneralSelfDefineEventDisDomain>>() {// 加载缓存
@Override
public List<GeneralSelfDefineEventDisDomain> load(String key)
throws Exception {
List<GeneralSelfDefineEventDisDomain> list = new ArrayList<GeneralSelfDefineEventDisDomain>(
1000);
return list;
}
});
cache.invalidateAll();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentDate = sdf.format(new Date());
// list = generalDayUserDao.querySelfDefineEventDisResult(qe);
if (cache.get(currentDate) != null && cache.get(currentDate).size()>0) {
list = cache.get(currentDate);
} else {
cache.cleanUp();
list = generalDayUserDao.querySelfDefineEventDisResult(qe);
cache.put(currentDate, list);
}
此处以当前日期为key,整个列表为value将值插入缓存,2个小时以上没有查询操作或者时间跨过一天时就清空缓存
想到的解决方法:
1. Nginx服务扩容(比较low,而且也无法从根本上解决问题)
2. 分析Mysql执行计划,给相应字段添加索引(这是必须的,前期索引没添加属于低级失误),查询速度提高一倍,但3秒还是不够快,Nginx依旧转发失败
3. 代码加入分页功能,比如一次加载20行(还是没能解决问题)
4. 对三次表连接操作进行分拆,单独查询出每个表的值,然后在Java代码中进行分类与归并(对代码改动较大,还未尝试)
5. 利用loadingcache进行内存缓存,来自google guava。样例代码如下:
public static LoadingCache<String, List<GeneralSelfDefineEventDisDomain>> cache = null;
static {
cache = CacheBuilder
.newBuilder()
// 设置大小,条目数
.maximumSize(10000)
// 设置时效时间,最后一次被访问
.expireAfterAccess(2, TimeUnit.HOURS)
// 移除缓存的监听器
.removalListener(
new RemovalListener<String, List<GeneralSelfDefineEventDisDomain>>() {
public void onRemoval(
RemovalNotification<String, List<GeneralSelfDefineEventDisDomain>> notification) {
}
})
// 缓存构建的回调
.build(new CacheLoader<String, List<GeneralSelfDefineEventDisDomain>>() {// 加载缓存
@Override
public List<GeneralSelfDefineEventDisDomain> load(String key)
throws Exception {
List<GeneralSelfDefineEventDisDomain> list = new ArrayList<GeneralSelfDefineEventDisDomain>(
1000);
return list;
}
});
cache.invalidateAll();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentDate = sdf.format(new Date());
// list = generalDayUserDao.querySelfDefineEventDisResult(qe);
if (cache.get(currentDate) != null && cache.get(currentDate).size()>0) {
list = cache.get(currentDate);
} else {
cache.cleanUp();
list = generalDayUserDao.querySelfDefineEventDisResult(qe);
cache.put(currentDate, list);
}
此处以当前日期为key,整个列表为value将值插入缓存,2个小时以上没有查询操作或者时间跨过一天时就清空缓存
相关文章推荐
- 一个简单web系统的接口性能分析及调优过程
- 编了一个简单的把阿拉伯数字转化成中文表示的程序,很粗糙,欢迎大家优化!!!
- 【实战】WebDav漏洞简单分析及通用exploit设计
- Python源码分析2 - 一个简单的Python程序的执行
- 实战JBuilder8 + Struts,一个简单的例子
- Ext源码分析源码分析之Ext的继承模式解说——第二节、一个简单的继承
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 一个优化分析的例子
- 实战 HTTP 处理程序(HTTP Handler) (1) -- 创建一个最简单的 HTTP Handler
- sql server 存储过程的优化.(变量表,临时表的简单分析)
- 一个简单的HTML语法分析类
- 对一个桌面主题文件的简单分析
- 对一个uClinux中的Makefile文件的简单分析(ZT)
- 一个实例来简单的说明接口
- 一个典型的简单C++程序的反汇编分析
- 一个简单的HTML病毒分析
- 一个简单的IAL分析(红外遥控)
- 给初学者:用VB写外挂 ———— 实战二:写一个简单而又完整的修改器—深海挣霸简体中文汉化版资源修改器
- 一个简单存储过程的性能分析
- 一个.net KeygenMe简单分析