Java Web高性能开发(二)

时间:2021-09-02 02:50:52

今日要闻:

性价比是个骗局:

对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜。

感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感——你们一千块买来的东西,我半价就入手了。

他忘了自己花了多少时间多少精力找到这个淘宝店,也忘了自己花了多少时间多少精力把这个淘宝店的评价看了个遍分析了个遍,更忘了自己花了多少时间多少精力学习分辨港版、美版、A货、B货。这些都是成本。当然,这不是问题,这么多时间和精力用在赚钱上也许赚不到五百块,两相比较,还是赚了。只可惜,他还忘了一个中心点,卖家也是中国人,也聪明:一,卖家不是活雷锋,也不是感动中国的候选人,要赚钱;二,卖家的聪明不是三五天个把月烧脑的结果,是诸多时间以及众多同行实践出来的智慧萃取出来的结晶,换言之,作为买家的他是在跟一大波成功经验的去伪存菁的总结拼杀。

 这个时候,性价比闪亮登场了

但性能能保证你看得了流畅的高清,玩得了最新的游戏,却保证不了不烫手,保证不了手机出现意外之后售后和服务热线不踢皮球,保证不了阳光下的显示效果,保证不了拍照效果,更保证不了你用了七天之后不出毛病。

再看性价比,也没有那么高大上了,其实就是把消费者最容易感受到的部分融为一炉,最明了的传递给用户,让用户可知可感,让用户觉得划算。它其实就是前文讲到的“便宜”,不过是换了一套行头,更隐蔽罢了。换言之,它接了“便宜”的班,“便宜”薪尽火传。仍旧是在那些你看不到的部分,不明白、不了解的部分,做手脚。

今日英文:

http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraperf.htm#JJDBC28752

Oracle11g jdbc 性能方面的扩展:

1.批量更新:也就是预编译语句

Statement stmt = conn.createStatement();//普通语句甚至存储过程语句都可以批量,但没有性能提升

stmt.addBatch("INSERT INTO emp VALUES(1000, 'Joe Jones')");
stmt.addBatch("INSERT INTO dept VALUES(260, 'Sales')");
stmt.addBatch("INSERT INTO emp_dept VALUES(1000, 260)");
PreparedStatement pstmt =
conn.prepareStatement("INSERT INTO employees VALUES(?, ?)");//正规情形,但限定于一个固定格式的语句 pstmt.setInt(1, 2000);
pstmt.setString(2, "Milo Mumford");
pstmt.addBatch(); pstmt.setInt(1, 3000);
pstmt.setString(2, "Sulu Simpson");
pstmt.addBatch();

11g以前,在ROLLBACK时,需要显式调用clearBatch来清空批语句,11g后不再需要

if (...condition...)
{
int[] updateCounts = pstmt.executeBatch();
...
}
else
{
pstmt.clearBatch();
...
}

预编译语句正常会返回-2

一般语句会返回正整数,表示影响的行数

存储过程语句会返回1

BatchUpdateException.getUpdateCounts 在出错时能得到已更新的计数

但 预编译语句总是为-3

正常语句则为已经执行的语句数

2.数据集预抓取,fetch size

useFetchSizeWithLongColumn 可以让PARSE, EXECUTE, FETCH 在一次连接中完成

降低fetch size 通常是为了腾出内存而利用网络

3.对于Type4来说,可以设置 disableDefineColumnType=true 来禁用defineColumnType

技术区:

Java Web高性能开发(二)

1.Flush 机制:无需等到网页内容全部加载完毕,一次性写回客户端,而是可以部分逐次的返回。

允许开发人员将网页的内容按文档流顺序逐步返回给客户端,这样可以使得用户知道我们的系统正在工作,

只要调用 HttpServletResponse.getWriter 输出流的 flush 方法,就可以将已经完成加载的内容写回给客户端。

实际上 Flush 机制会增加用户等待时间、增加浏览器渲染时间,但是对于大网页来说,降低这点效率来增强用户体验,是值得的。

2.动静分离,就是将 静态和动态的内容分别放在不同的服务器上,有针对性的处理动态和静态内容,从而达到性能的提升。

对于静态资源处理的服务器软件,我们可以选择 Nginx,支持高并发

3.持久连接(Keep-Alive)也叫做长连接,它是一种 TCP 的连接方式,连接会被浏览器和服务器所缓存,在下次连接同一服务器时,缓存的连接被重新使用。

由于 HTTP 的无状态性,人们也一直很清楚“一次性”的 HTTP 通信。持久连接则减少了创建连接的开销,提高了性能。

HTTP/1.1 已经支持长连接,大部分浏览器和服务器也提供了长连接的支持。

浏览器在请求的头部添加 Connection:Keep-Alive,以此告诉服务器“我支持长连接,你支持的话就和我建立长连接吧”,而倘若服务器的确支持长连接,那么就在响应头部添加“Connection:Keep-Alive”,从而告诉浏览器“我的确也支持,那我们建立长连接吧”。服务器还可以通过 Keep-Alive:timeout=10, max=100 的头部告诉浏览器“我希望 10 秒算超时时间,最长不能超过 100 秒”。

Tomcat 里,默认长连接是打开的,当我们想关闭长连接时,只要将 maxKeepAliveRequests 设置为 1 就可以。

4.简单的在 JSP 的 request 对象中添加响应头部,往往可以迅速提升程序性能,一切实现代码仿佛都成浮云。

<%
SimpleDateFormat f2=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
String ims = request.getHeader("If-Modified-Since");
if (ims != null)
{
try
{
Date dt = f2.parse(ims.substring(0, ims.length()-4));
if (dt.after(new Date(2009, 1, 1)))
{
response.setStatus(304);
return;
}
} catch(Exception e)
{ }
}
response.setHeader("Last-Modified", f2.format(new Date(2010, 5, 5)) + " GMT");
%>

上述代码的意图是:服务器获得浏览器请求头部中的 If-Modified-Since 时间,这个时间是浏览器询问服务器,它所请求的资源是否过期,如果没过期就返回 304 状态码,告诉浏览器直接使用本地的缓存就可以,

5.CDN,就是一种内容分发网络,它采用智能路由和流量管理技术,及时发现能够给访问者提供最快响应的加速节点,并将访问者的请求导向到该加速节点,由该加速节点提供内容服务。

CDN 客户不需要改动原来的网站结构,只需修改少量的 DNS 配置,就可以加速网络的响应速度。

DNS 域名服务器通过 CNAME 方式将最终域名请求重定向到 CDN 系统中的智能 DNS 负载均衡系统。

智能 DNS 负载均衡系统通过一组预先定义好的策略(如内容类型、地理区域、网络负载状况等),将当时能够最快响应用户的节点地址提供给用户,使用户可以得到快速的服务。

同时,它还与分布在不同地点的所有 CDN 节点保持通信,搜集各节点的健康状态,确保不将用户的请求分配到任何一个已经不可用的节点上。

而我们的 CDN 还具有在网络拥塞和失效情况下,能拥有自适应调整路由的能力。

非技术:

每天能写文章(博客、微信公号)的人是怎么安排时间的?

1.其实做你喜欢做的事,时间就总会有的;写你想表达的内容,就不会花费太多的时间

2.你发现了,灵感这玩意,总是转瞬即逝的。所以,秘诀一,就是要学会收集灵感。

3.请尽力把写作这件事培养成为一个自己稳定的习惯就好。
一个习惯要被培养起来的必要条件,是稳定的时间段和环境。所以,你可以试着连续一阵在相同的时间、相同的地点、相同的氛围和环境之下去写东西,有过一段时间的体验之后,它会成为你生命中的一部分。

4.看书并记住书中的东西只是记忆,并没有涉及推理,只有靠推理才能深入理解一个事物,看到别人看不到的地方,这部分推理的过程就是你的思维时间,也是人一生中占据一个显著比例的“暗时间”,你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉,所有这些时间都可以成为“暗时间”,你可以充分利用这些时间进行思考,反刍和消化平时看和读的东西,让你的认识能够脱离照本宣科的层面。这段时间看起来微不足道,但日积月累将会产生庞大的效应。

5.做一个有心人,一张画,一个人,一件事都可以写出一千字;

6.将自己的想法迅速形成文字的能力,将写一千字的时间控制在一个小时内;

7.每周给自己定几个课题,这些课题不光能让你有心情也得预见读者们会喜欢