Java Web高性能开发(二)
今日要闻:
性价比是个骗局:
对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜。
感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感——你们一千块买来的东西,我半价就入手了。
他忘了自己花了多少时间多少精力找到这个淘宝店,也忘了自己花了多少时间多少精力把这个淘宝店的评价看了个遍分析了个遍,更忘了自己花了多少时间多少精力学习分辨港版、美版、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.每周给自己定几个课题,这些课题不光能让你有心情也得预见读者们会喜欢
Java Web高性能开发(二)的更多相关文章
- Java Web高性能开发(三)
今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提 ...
- Java Web 高性能开发,第 3 部分: 网站优化实战
这个系列的前两篇,介绍了前端的优化技术,这些技术秉承了前人至高无上的智慧,我只是负责吸收和传播.然而,这些技术一般也都是某某大型网站的技术经验,我们大部分人或许只能接触到相对小规模的网站,小规模的网站 ...
- Java Web 高性能开发,前端的高性能
Java Web 高性能开发,第 2 部分: 前端的高性能 Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.Web 的思想是 ...
- Java Web 高性能开发,第 2 部分: 前端的高性能
Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.Web 的思想是通用的,它们也可以运用到 Java Web.这一系列的文章, ...
- Java Web 高性能开发,第 1 部分: 前端的高性能
Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.所有 Web 的思想都是通用的,它们也可以运用到 Java Web.这一系列 ...
- Java Web高性能开发 - 前端高性能
作者:IBM developerWorks链接:https://www.ibm.com/developerworks/cn/java/j-lo-javawebhiperf1/著作权归作者所有.商业转载 ...
- java web Servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- java web轻量级开发面试教程读书笔记:建索引时我们需要权衡的因素
场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大.当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于"性价比"不高. ...
- 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程
上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜. 为了感谢管理员和大家的支持,再 ...
随机推荐
- Java并发编程知识总结
一.线程 1.线程创建: 继承Thread类创建线程类 实现Runnable接口创建线程类 使用Callable和Future创建线程 Runnable是执行工作的独立任务,但是它不返回任何值,如果希 ...
- 生成24位字符串ID__IdGenerator.java
此工具类用于生成24位字符串ID,唯一不重复.直接通过 IdGenerator.get() 获取. 源码如下:(点击下载源码 - IdGenerator.java ) import java.net. ...
- Maven下使用Jetty进行Debug
1.环境和条件 Maven-3.0.3Eclipse请阅读者事先具备一定maven知识 2 配置2.1 添加Jetty插件 在pom.xml中加入如下代码段 <plugin> <gr ...
- 每天一个小算法(Shell Sort3)
希尔算法自己编了一个,循环很多,很不美观,不过运行正确: c语言实现: #include <stdio.h> #include <stdlib.h> #define LEN 2 ...
- hdu - 1180 诡异的楼梯 (bfs+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1180 注意点就是楼梯是在harry移动完之后才会改变方向,那么只要统计到达这个点时间奇偶性,就可以知道当前楼梯是 ...
- 纠结和郁闷的存在感-关于DirectX与HLSL的矩阵存储方式---转载好文章
我常常这么大胆的认为,搞科学的人总是喜欢用各种让常人难以理解的复杂方式去处理某些其实可能很简单的事情,这种情况在他自身擅长的.有着诸多对手竞争的领域上极为常见.比如吧,搞DirectX的人用了左手坐标 ...
- Java面向对象编程概述
一. 01.软件开发经历周期: 软件分析:分析问题领域,了解客户的需求 软件设计:确定软件的总体结构,把整个软件系统划分为大大小小的多个子系统,设计每个子系统的具体结构 软件编码:用选定的编程语言来编 ...
- Spring MVC 下index.jsp访问
spring-mvc.xml配置 <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.we ...
- HDU 1698 (线段树 区间更新) Just a Hook
有m个操作,每个操作 X Y Z是将区间[X, Y]中的所有的数全部变为Z,最后询问整个区间所有数之和是多少. 区间更新有一个懒惰标记,set[o] = v,表示这个区间所有的数都是v,只有这个区间被 ...
- github.io hexo 安装
/***************************************************************** * github.io hexo 安装 * 说明: * 本文记录h ...