本博客从今年年初开始,其实已经完成了基本功能。随着偶尔写两篇文章,本站访问速度越来越慢。最开始使用的是腾讯云的最基础云服务器,配置为:共享CPU、512M、Unbuntu服务器,每次打开服务器,发现CPU和内存使用率经常达到了100%,基本满载运行。还经常报内存溢出异常。
后来,升级了服务器,内存变为了1G,CPU也变成了单核。但是网站的访问速度还是让人不能忍受。今天,博主终于不能忍了,仔细分析了下代码和服务器。主要从以下两个方面进行了优化,大大提高了网站访问速度:
(1)坑爹的Hibernate,from查询。
虽然博主早就明白数据库查询的时候,坚决避免select *。但是博主还是犯了迷信框架这个错误,Hibernate默认推荐的是 from 对象。这种处理方法无疑将所有查询默认为select *,这简直是一种愚蠢的做法。特别是当数据库中存储有大文本字段的时候。本博的文章才16篇的时候,已经慢的不行了。
解决办法:查询部分字段
这种方法需要在实体类中构造指定字段的构造方法,查询语句中使用:select new Blog(b.id,b.title,b.content2,b.author,b.pubDate,b.click) from Blog b。否则,查询出来的集合对象不能直接转换为List对象,Hibernate的面向对象功能将失去其优势。
(2)对特殊字段进行处理。
由于博客中的内容字段是longText类型,每次直接从数据库中取出来的时候,将大大降低数据库的IO。虽然Hql自带了许多函数,比如substring函数,可以直接操作数据库内容。但是,这样的结果是:直接导致查询出来的结果是Object数组。有意思吗?转换起来又麻烦得要死。没办法,只好,存储一个冗余字段content2,每次更新的时候,取content2=content.subString(0,300)。
(3)网站图片的处理。
对于图片,我们有两种处理方式,存储在数据库中,或者把链接地址存储在数据库中。前者,使用方便,我们可以直接把图片复制到博客中发表,非常简单,不用转换。缺点是:早期数据库不推荐,现在数据库性能还好,无所谓。后者方法,每次需要使用图片时,先上传到服务器上,拿到链接地址,数据库中只存储链接地址。这种方法麻烦了点,特别是图片多的时候。
好吧。。博主不从使用的便捷性考虑问题,来点程序员的思路。图片存储在数据库中是二进制数据,并且这个量相对于文本还是相当大的。如果我们需要对数据库内容进行搜索、全文检索时,那么就非常不推荐把图片直接存储在数据库中,否则会严重影响文本检索结果。如果需要对图片进行特别处理的话,比如图片检索的话,那就需要提取出图片的关键性特征等信息,另外存储了,这样的信息存储在数据库中也比较好。
从性能上来讲,大家可以比较下这相同的两篇文章:http://www.webank.pw/blog_show.action?blog.id=6和http://www.webank.pw/blog_show.action?blog.id=21的访问速度。这篇文章内容总共包含17张图片,共600KB大小。但是访问速度已经可以明显区分了。前面一篇文章的图片是存储在数据库中的,后面一篇是存储在服务器的。后者明显快于前者。至于原因,这里各种分析就略了,什么服务器性能啊、服务器带宽啊、客户端网速啊、图片传输速度啊、图片显示速度啊。。。。。大家感兴趣的可以进行专业分析的。
经过以上处理后,本站的访问速度总算是正常了。不再半天没反应。