大数据量处理、多线程和高并发的问题一直是Java技术面试中比较喜欢问的问题之一,遂在此做个总结
一、数据量太大获取缓慢怎么办?
貌似这个问题在所有开发的应用系统中都会碰到这个问题,随着时间的推移,由于需求的不断演变,项目的数据量日渐增多,功能上的效率问题也会逐步显露出来,例如统计报表、查询下载、地图渲染等功能模块,当这些功能涉及到几十张表甚至上百张表时,不难想象一次性获取所有数据的时候系统将会变得异常缓慢。
1、首先从需求的设计和代码层次出发
- 优化我们写的代码,减少没必要的资源浪费。例如频繁地使用new对象的方式以及if else和多个for循环的嵌套使用,对于大量的if和else及switch case的优化大家可以参考多个if else如何优化和多个switch case如何优化,喜欢阅读的朋友可以看下《重构——改善既有代码的设计》这本书,另外对于代码上的优化也方便于后期的维护使得代码上的可读性更高,除了逻辑控制代码,也需要注意其字符串的处理以及List的数据的处理。字符串的话,使用StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问。对于List上去重或者排序之类的处理,大家可参考java8系列文章;
- 优化代码中的SQL语句,这也是重中之重,当查询的数据牵扯到的数据库表比较多时。频繁地使用左连接或者内连接极大地会降低数据库查询的效率,对于SQL的优化大家可使用Explain命令进行对SQL语句的检查效率,尤其要注意主表和次表的连接关系,根据Expalin的结果可对于部分字段及数据库表增加相关的索引;
2、数据库优化
对于数据库的优化,在此不再做详细探讨。有时间我会再针对数据库的优化整理出一篇文章,大致的方案有如下几点
- 数据库读写分离。
- 数据库集群和库表散列即分区分表。
- 数据库表结构优化。
- 批量读取和延迟修