一、淘宝网的困境
对于淘宝网这样的大型电子商务网站,对于图片服务的要求特别的高。而且对于卖家来说,图片远胜于文字描述,因此卖家也格外看重图片的显示质量、访问速度等问题。根据淘宝网的流量分析,整个淘宝网流量中,图片的访问流量会占到90%以上,而主站的网页则占到不到10%。同时大量的图片需要根据不同的应用位置,生成不同大小规格的缩略图。考虑到多种不同的应用场景以及改版的可能性,一张原图有可能需要生成20多个不同尺寸规格的缩略图。
淘宝整体图片存储系统容量1800TB(1.8PB),已经占用空间990TB(约1PB)。保存的图片文件数量达到286亿多个,这些图片文件包括根据原图生成的缩略图。平均图片大小是17.45K;8K以下图片占图片数总量的61%,占存储容量的11%。对于如此大规模的小文件存储与读取需要频繁的寻道和换道,在大量高并发访问量的情况下,非常容易造成读取延迟。
2007年之前淘宝采用NetApp公司的文件存储系统。至2006年, NetApp公司最高端的产品也不能满足淘宝存储的要求。首先是商用的存储系统没有对小文件存储和读取的环境进行有针对性的优化;其次,文件数量大 ...
每天去做一件自己虽不喜欢, 但却有意义的事: 每天做十分钟的运动, 每天背十个英文单字, 每天读一小段最新的商业期刊,每天饶恕一个自己不喜欢的人(哇!这个最难!)这些事情我不喜欢, 但却很有意义! 不用太久, 我的身体、知识、修养、专业能力 ……,不久,ㄧ定会有迅速惊人的进步。人生, 该是 「进步 + ing」(现在进行式), 而不应是 「进步 + ed」(过去式) 或 「be going to + 进步」 (未来式); 该是把握现在, 懂得不时地保持在上进状态,绝不因时间或任何的关系而停止努力, 或是一再地告诉自己「反正明天再开始也不迟」。 昨天的我、今天的我、明天的我,三者能连成一条向上攀升的曲线吗? 套一句莎士比亚的话: ** 斧头虽小, 但多劈几次, 就能将坚硬的树木伐倒 **
多线程-并发
未读线程池的技术背景在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些”池化资源”技术产生的原因。比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同样符合这一思想。
目前,一些著名的大公司都特别看好这项技术,并早已经在他们的产品中应用该技术。比如IBM的WebSphere,IONA的Orbix 2000在SUN的 Jini中,Microsoft的MTS(Microsoft Transaction Server 2.0),COM+等。
现在您是否也想在服务器程序应用该项技术?
线程池技术如何提高服务器程序的性能我所提到服务器程序是指能够接受客户请求并能处理请求的程序,而不只是指那些接受网络客户请求的网络服务器程序。
多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著 ...
摘要: 在奥巴马都号召大家学编程的年代,越来越多的人加入到这个行业中,当然也有人好奇,到底该如何学编程?有人把学编程比作挑选家具,但前提必须要知道自己想要什么样的家具?
在日常生活中,常常会听到:“我想学编程”,看似简单的一句话,仔细分析,其中的奥妙可不少。你想学什么样的编程,是一个简单的Hello World,还是开发移动应用呢?本文作者Scott Hanselman把这个问题比喻成选家具,是去宜家还是从种树开始呢?并且与大家探讨了码农、黑客、程序员、开发者和计算机科学家之间的区别?下面是笔者对原文的翻译。
最近有朋友向我提问:说他想学如何编写代码,但不知道该如何下手以及该从哪里起步?
学习如何编码——是去宜家还是从种树开始?
好比想当木工,你可以选择从种树开始,然后砍树、打磨,最终制作家具。或者,你也可以直接去宜家,也可以介于这两者之间。
直接修改WordPress主题就好比是去宜家,自己动手编写一个Web框架就好比种树,通常都是因为没有自己喜欢或者现成的“树”。**无论是自己“种树”还是直接选择现成的,你都必须决定自己想要的家具。 **
好吧,该从哪里开始?
每当我听 ...
即使是经验丰富的Java开发人员和架构师也会犯错。今天,我们讨论了如果您不密切注意,您可能会犯的Java开发人员常见错误!我根据烦恼将它们按降序排列-#1最让我困扰,但是根据其他因素,所有这10个人都会给您带来相同的伤害;-)
常见Java错误#10:滥用或误解依赖注入依赖注入通常被认为是企业项目中的“一件好事”。使用它不会出错。但这是真的吗?
DI的基本思想之一是,您无需以对象查找其依赖关系,而是在以定义良好的方式(使用DI框架)创建对象之前初始化依赖关系,而在实际创建对象时,只需将其传递给对象即可。构造函数中的预配置对象(constructor-injection)或使用方法(方法注入)。
但是,最重要的是,您通过了对象的需求,仅此而已。但是,即使在全新项目中,我仍然可以找到这样的代码:
12345678910111213141516171819public class CustomerBill { //Injected by the DI framework private ServerContext serverConte ...
声明:这是转载的
来源:http://www.csdn.net/article/2012-09-12/2809862-6-java-to-uml-tools
本文介绍6款开源的工具,可以将Java项目反向工程到UML的类图。
1.Eclipse MDT
模型开发工具(MDT)提供了一些示范性工具,在元模型的基础上的发展模式。它支持创建UML图,从代码的逆向工程到UML图等等。
2.ArgoUML
ArgoUML是一个领先的开源UML模型工具,它支持UML 1.4的所有标准,可以运行于任何Java平台上。
3.ModelGoon
ModelGoon是一个Java包的依赖分析的Eclipse插件,用来显示项目中Java包与包之间的依赖关系,如下图所示:
4.Green
Green是Eclipse的一个插件,是一种先进的还简单的UML类图的工具,主要学生开发使用。它是live round-tripping编辑器,因此可以很容易地从一个UML类图生成Java代码。它有很好的可扩展性。
5.Minjava
Minjava是一个Java反向工程软件,可帮助理解 ...
JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。而这个main()方法必须是共有的(public)、静态的(static)、返回值为void,并且接受一个字符串数组作为参数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
12345678public class Test { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Hello World"); }}
在上面的 ...
PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别以及如何避免SQL注入式攻击?这篇教程中我们会讨论为什么要用PreparedStatement?使用PreparedStatement有什么样的优势?PreparedStatement又是如何避免SQL注入攻击的?
PreparedStatement是什么?PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预 ...
为了深入了解Java的ClassLoader机制,我们先来做以下实验:
package java.lang;
public class Test {
public static void main(String[] args) {
char[] c = "1234567890".toCharArray();
String s = new String(0, 10, c);
}
}
String类有一个Package权限的构造函数String(int offset, int length, char[] array),按照默认的访问权限,由于Test属于java.lang包,因此理论上应该可以访问String的这个构造函数。**编译通过!**执行时结果如下:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: ...
一 Two-Phase Termination Pattern
Two-Phase Termination Pattern,指的就是当希望结束一个线程的时候,送出一个终止请求,但是不会马上停止,做一些刷新工作。进入“终止处理中”,在该状态下,不会进行该线程日常工作任务的操作,而是进行一些终止操作。
这个方式所考虑的因素如下:
1,必须要考虑到使得该线程能够安全的结束,Thread中的stop会有问题的,因为它会不管线程执行到哪里,都会马上停止,不能保证安全的结束。
2,一定能够进行正常的终止处理,在java中,这点可以使用finally来实现
3,能够高响应的终止,收到终止后,当线程在wait或者sleep或者join的时候,不用等到时间到才终止,而是马上中断线程的这些状态,进而进行终止操作。
当一个线程正在执行周期性的工作时候,在“作业中”发了停止执行绪的请求,此时该线程不能马上离开停止,而应该先做完本次周期内部的工作,然后进入“善后阶段”完成一些善后的工作,所谓的两阶段终止,即中止“运作阶段”,并完成“善后阶段”,完整的完成执行绪的工作。
两阶段终止线程 ...