0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

使用Velocity生成静态页面减轻数据库压力提升网站性能

为减轻数据库服务器的访问压力,使用Velocity模板引擎为生成静态页面

在大型商务网站或门户网站中,网站的访问量一般很高,所以需要对网站的性能进行优化。其中数据库的瓶颈是阻止网站正常运行的最大问题所在。所以我们可以通过技术减少数据库的访问次数。

为此,可以使用静态页面技术。对于那些经常需要访问的页面,生成对于的静态页面。这样用户访问到的是静态页面时,不用访问数据库,大大的减少了数据库的压力。这里,我们使用Velocity模板引擎生成静态页面的方法为经常访问的页面生成静态页面。

准备项目环境

首先引入Velocity相关的JAR包,并在项目中适当的地方创建runtime.log和file.resource.loader.path需要用到的目录

详细的步骤见:Velocity模板引擎的介绍和基本的模板语言语法使用

初始化Velocity模板引擎

在项目初始化的同时初始化Velocity模板引擎,这里把初始化代码写在一个Filter的init方法中,并且动态生成Properties配置:

try{
Properties prop = new Properties();
prop.put("runtime.log", filterConfig.getServletContext().getRealPath("/WEB-INF/log/velocity.log"));
prop.put("file.resource.loader.path", filterConfig.getServletContext().getRealPath("/WEB-INF/vm"));
prop.put("input.encoding", "UTF-8");
prop.put("output.encoding", "UTF-8");
Velocity.init(prop);
}catch( Exception e ){
e.printStackTrace();
}

在适当的处理方法中输出静态页面

这里因为在产品展示界面需要生成静态页面,所以在产品添加和修改的Action方法中添加生成静态页面的代码即可,生成的shtml文件保存在网站的根目录的html文件夹下:

File saveDir = new File(request.getSession().getServletContext()
.getRealPath("WebRoot/html/product/"+product.getType().getTypeid()));
System.out.println(saveDir);
if(!saveDir.exists())
saveDir.mkdirs();
VelocityContext context = new VelocityContext();
context.put("product", product);
Template template = Velocity.getTemplate("productview.html");
File output = new File(saveDir, product.getId()+".shtml");
FileOutputStream outStream = null;
OutputStreamWriter writer = null;
BufferedWriter sw = null;
try {
outStream = new FileOutputStream(output);
writer = new OutputStreamWriter(outStream,"UTF-8");
sw = new BufferedWriter(writer);
template.merge(context, sw);
sw.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sw.close();
outStream.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}

替换原来的访问数据库链接

最后把原来查看产品展示界面的链接替换成静态页面的链接即可:

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法