JAVA---优化编程读书笔记(二)
来源:互联网 发布:巨人网络 武极天下 编辑:程序博客网 时间:2024/06/06 04:53
七、JSP与SERVLET
1. 通过init方法缓存静态数据
2. 用print代替println,用ServletOutputStream代替 PrintWriter,因为不需要再把字符流转为字节流,提高效率;如果要用PrintWriter,最好这样:
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
PrintWriter pw = new PrintWriter(baos);
3. flush()之后数据才发完,这时候可以部分输出。即
ServletOutputStream Out = res.getOutputStream();
Out.write(header);
Out.flush;
Out.write(gif);
Out.flush;
Out.write(footer);
Out.flush;
4.减少同步代码的数量
5. 设置合适的响应内容长度response.setContentLength()
6. 缓存静态数据与动态数据:session,application,应用服务器的设置
但是要注意数据可能与数据库中的不一致,需要定时更新。
session.setAttribute() session.getAttribute()
7.不要使用singlethreadmodel,尽量用threadpool,每次servlet引擎会把一个线程指派给一个请求然后放回池中。
8. Filter listener的使用
十、JDBC与性能优化
1、 使用数据库连接池改善效率,并及时关闭连接对象,合理选择事务(ACID,减少不必要的commit)
2、 优化statement:
当需要成批处理重复插入或者更新操作或者有大量用户重复操作时,采用PreparedStatement,只编译解析一次命令,然后放到命令缓冲区。
尽可能批处理更新:addBatch(),executeBatch()
采用适当数据缓存:setFetchSize(),getFetchSize()每次以增量的方式获取结果集,不必要重复查询
3、 优化resultset:
设置数据缓冲、处理数据行的方向(减少定位消耗)、getXX()
十一、软件结构、设计模式、性能优化
常用的设计模式:
AbstractFactory, Singleton, Adapter, Proxy, Bridge, Command, Observer, Chain ofResponsibility, Mediator, Visitor
任务分配中心模式:
分离具体请求和处理者,松散耦合,在三层web应用体系中十分有用。
public class TaskAssignmentCenter{private Request request = null;public void acceptRequest(Request request){this.request = request;}public void assignTask(){//after receive the request, find the description of this task, and call concrete handler to handle this task.String requestObjective = request.getRequestObjective();/*if(requestObjective.equals("Atask")){new ConcreteHandlerA().handleRequest(request);}else if(requestObjective.equals("Btask")){new ConcreteHandlerB().handleRequest(request);}*/java.util.Properties prop = ConfigUTL.getConfigInfo();try{Handler handler = (Handler) Class.forName(prop.getProperty(requestObjective)).newInstance();handler.handleRequest(request);}catch(Exception e){e.printStackTrace();}}public static void main(String [] args){ConcreteRequestA cra = new ConcreteRequestA();cra.setRequestObjective("Atask");ConcreteRequestB crb = new ConcreteRequestB();crb.setRequestObjective("Btask");ConcreteRequestC crc = new ConcreteRequestC();crc.setRequestObjective("Ctask");TaskAssignmentCenter tac = new TaskAssignmentCenter();tac.acceptRequest(cra);tac.assignTask();tac.acceptRequest(crb);tac.assignTask();tac.acceptRequest(crc);tac.assignTask();}}
import java.io.*;import java.util.Properties;public class ConfigUTL{private static Properties prop = new Properties();private static boolean isLoaded = false;public static Properties getConfigInfo(){return prop;}static {if(!isLoaded){try{InputStream is = new ConfigUTL().getClass().getResourceAsStream("RequestAndHandler.conf");prop.load(is);isLoaded = true;}catch(IOException e){isLoaded = false;e.printStackTrace();}}}}
public interface Request{public void setRequestObjective(String objective);public String getRequestObjective();}
public class ConcreteRequestA implements Request{private String objective = null;public void setRequestObjective(String objective){this.objective = objective;}public String getRequestObjective(){return this.objective;}}
public class ConcreteRequestB implements Request{private String objective = null;public void setRequestObjective(String objective){this.objective = objective;}public String getRequestObjective(){return this.objective;}}
public interface Handler{public void handleRequest(Request request);}
public class ConcreteHandlerA implements Handler{public void handleRequest(Request request){System.out.println("handler A handle task A!");}}
public class ConcreteHandlerB implements Handler{public void handleRequest(Request request){System.out.println("handler B handle task B!");}}
RequestAndHandler.conf中的内容:可以继续添加C
Atask = ConcreteHandlerABtask = ConcreteHandlerBCtask = ConcreteHandlerC
十二、多线程
1. 线程状态:init,start,running,wait,dead;
3. 线程池 (线程池管理器、线程池、工作线程、任务接口等组成)
资源允许的情况下,选择并发请求数量的峰值作为线程池的大小。但是要考虑资源。
线程池管理器功能:创建线程池实例,销毁,只有一个线程池管理器实例。
线程池功能:初始化,缓存待命线程,提供待命线程,唤醒线程处理任务。
如下是线程池的一个简单实现:
public class PoolAdvanceServer{public static int clientCount = 0;static int port = 7654;ThreadPool threadPool = PoolManager.getInstance().createThreadPool(100,ServerWorker.class);public void listenServer(int port) throws Exception{ServerSocket sSocket = new ServerSocket(port);System.out.println("advanced server is listening port " + port);while(true){clientCount++;threadPool.performWork(sSocket.accept());}}public static void main(String[] args){}}
public class PoolManager{private static PoolManager instance = null;private PoolManager(){}//only one pool managerpublic static PoolManager getInstance(){if(instance == null)instance = new PoolManager();return instance;}//get thread pool public ThreadPool creatThreadPool(int max, Class worker){ThreadPool threadPool = null;try{threadPool = new ThreadPool(max,worker)}catch(Exception e){e.printStackTrace();}return threadPool;}}
public class ThreadPool{//the threat to workclass WorkerThread extends Thread{private Worker _worker;private Object _data;WorkerThread(String id, Worker worker){super(id);_worker = worker;_data = null;}//wake this thread and do some worksynchronized void wake(Object data){_data = data;notify();}synchronized public void run(){boolean stop = false;while(!stop){//when init, all work thread is waitingif(_data == null){try{wait();}catch(Exception e){e.printStackTrace();continue;}}//after performWork wake this thread, it ask worker to do some work if(_data != null){System.out.println(this.getName);_worker.run(_data);}_data = null;//work over, return this thread to stack, if ok, this thread continues to wait; else kill this thread stop = !(_push(this));}}}//thread in preparationprivate Stack _waiting;private int _max;//worker classprivate Class _workerClass;public ThreadPool(int max, Class workerClass) throws Exception{_max = max;//create a stack for waiting thread_waiting = new Stack();//equals to serverworker_workerClass = workerClass;//worker do some workWorker worker;//controls workerWorkerThread w;//create max threads , waitingfor(int i = 0; i < _max; i ++){worker = (Worker)_workerClass.newInstance();w = new WorkerThread("Worker#" + i, worker);w.start();_waiting.push(w);}}//pop one waiting threadpublic void performWork(Object data ) throws InstantiationException{WorkerThread w = null;synchronized (_waiting){if(_waiting.empty()){try{w = new WorkerThread("additional worker", (Worker)_workerClass.newInstance());w.start();}catch(Exception e){throw new InstantiationException("problem creating instance of Worker.class: " + e.getMessage());}}else{w = (WorkerThread) _waiting.pop();}}//wake this work threadw.wake(data);}//return thread to the stackprivate boolean _push(WorkerThread w){boolean stayAround = false;synchronized (_waiting){if(_waiting.size() < _max){stayAround = true;_waiting.push(w);}}return stayAround;}}
public interface Worker{public void run(Object data);}
public class ServerWorker implements Worker{public void run(Object data){processRequest((Socket) data);}//this worker do it's workprivate void processRequest(Socket socket){try{InputStream ins = socket.getInputStream();OutputStream os = socket.getOutputStream();DataInputStream dis = new DataInputStream(ins);DataOutputStream dos = new DataOutputStream(os);int receiveInt = dis.readInt();System.out.println("this message is from client " + PoolAdvanceServer.clientCount + " : " + receiveInt);dos.writeInt(receiveInt * 18);dos.flush();dos.close();dis.close();ins.close();delay(101);PoolAdvanceServer.clientCount --;}catch(Exception e){e.printStackTrace();}}private void delay(long delayCount){try{Thread.sleep(delayCount);}catch(Exception e){e.printStackTrace();}}}
十三、泛型与应用优化(JDK1.5)
1. 支持定义带有抽象数据类型参数的类,提供了程序的类型安全且易兼容
在编译时进行类型检查,提高程序可靠性。
2. 避免强制类型转换:原来在用集合时对象放入后成为Object实例,取出时转换繁琐。
3. 性能提升:初始实现是把强制类型转换插入字节码中,get()返回值类型指明。
4. 基本数据类型自动pack,unpack,可以限制泛型中类型参数的范围,如V extends Number
class Parent{private Parent(){System.out.println("private ");}}//generic public class Test<K extends String, V extends Number> //forbidden: extends Parent, because subclass cannot call superclass's private method{private V v = null;private K k = null;public static void main(String[] args){Test t = new Test();t.k = "test";t.v = 12.3;System.out.println(t.k);System.out.println(t.v);}}
- JAVA---优化编程读书笔记(二)
- JAVA---优化编程读书笔记(一)
- 7. java编程思想读书笔记(二)
- Java并发编程实践读书笔记(二)
- Java编程思想读书笔记(二)----接口
- 《JAVA并发编程实践》读书笔记(二)
- Java并发编程艺术----读书笔记(二)
- JAVA编程思想读书笔记二
- java编程思想读书笔记(二)
- 《Java网络编程》读书笔记(二)socket编程
- JAVA性能优化权威指南 读书笔记(二)
- java编程思想(Think in java)读书笔记 二
- java代码优化编程(二)
- Java并发编程读书笔记(二)之原子操作
- JAVA读书笔记(二)
- 《Java编程思想》读书笔记之二
- java编程思想读书笔记二:一切都是对象
- 《java 多线程编程核心技术》读书笔记二
- 【转】神坛上的美国蓝宝石晶体生长设备
- 3.0正式版环境搭建(4)-- 运行(3)创建的工程
- 关于MySql 5.6 'localhost' (10061)问题
- android读取assets下的资源
- 我的CSDN博客开通啦!
- JAVA---优化编程读书笔记(二)
- BlockingQueue--java多线程
- 关于GitHub的使用
- 第一课 | 第三节 | 常见样式
- git - git log 限制输出长度
- spring-mvc入门
- javaScript——优化
- Git的基本使用
- 【LeetCode】Text Justification 解题报告