- 浏览: 251426 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
郑涵魁:
这才是好文啊
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 -
silvia016:
很有用,非常感谢
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 -
chengcwn:
好文章,多谢分享!
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 -
young7:
不错,特别是那个参考文章
JAVA调用Shell脚本--及阻塞的解决办法 -
zhujianbogo:
什么邮件列表,能说下解决方案吗? 谢谢 。 我也遇到这个问题了 ...
Tomcat与apache2集群的问题
最近用新的一套web框架做项目,有很多常用的包集成在里面。
这里总结一下:
每天总结三个
Commons-Discovery.jar:
使用Apache Commons 的
Discovery 工具包可以实现接口和实现的分离,包括JAR
SPI规范的简单实现。
Discovery组件被用以查找可插拔接口的实现实例,它提供了一种通用的实例化这些实现的方式,而且可以管理单例(工厂)的生命周期。本质上来讲,就是定位那些实现了给定Java接口的类,并实例化。除此之外,Discovery还可以用以在给定的classpath中查找并加载资源文件。
Discovery组件在查找所有的实现类的时候需要预先将允许被查找的实现类配置到默认的配置文件中,默认的配置文件为:
/META-INF/services/<YOUR
Interface whole name including pkg name>,
Discovery将依次加载该文件中配置的允许加载的实现类。
另外接口和实现类的映射关系也可以在一个properties配置文件中定义,格式是:
XXX(接口类名)=XXXimpl(实现类名)
结合面向接口的编程方法,可以实现一个简单的面向服务的调用方式。
ClassLoaders loaders = ClassLoaders.getAppLoaders(serviceClass, serviceClass.getClass(), false ); DiscoverClass discover = new DiscoverClass(loaders); // 使用newInstance方式直接产生接口实现的实例 implInstance = (PublicService) discover.newInstance(serviceClass, defaultImpl); // 也可以使用find的方式返回对应的实现类 implClass = discover.find(serviceClass, configFile, defaultImpl); /**** 完整程序中使用了cglib的 net.sf.cglib.proxy.Enhancer 对返回的实现类进行了增强,可以实现一个简单的面向方面的程序结构: **/ public class ServiceFinder { private static final String configFile = " services.properties " ; private static Enhancer enhancer = new Enhancer(); private ServiceFinder() { } public static PublicService lookup(Class serviceClass) { return lookup(serviceClass, null ); } public static PublicService lookup(Class serviceClass, String defaultImpl) { // 创建一个类装入器的实例 ClassLoaders loaders = ClassLoaders.getAppLoaders(serviceClass, serviceClass.getClass(), false ); DiscoverClass discover = new DiscoverClass(loaders); PublicService impl = null ; try { Class implClass = null ; // 用DiscoverClass的实例来查找实现类 if (defaultImpl == null || "" .equals(defaultImpl)) { implClass = discover.find(serviceClass, PropertiyFile.load(configFile)); } else { implClass = discover.find(serviceClass, configFile, defaultImpl); } enhancer.setSuperclass(implClass); enhancer.setCallback( new ServiceInterceptor(implClass.toString())); impl = (PublicService) enhancer.create(); // using DiscoverClass instance lookup the impelement // impl = (PublicService) discover.newInstance(serviceClass, defaultImpl); } catch (Exception ex) { ex.printStackTrace(); throw new IllegalArgumentException( " 无法获取指定的服务项 " ); } return impl; }
ommons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以有效地减少处理对象池化时的工作量,为其它重要的工作留下更多的精力和时间。
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。
PoolableObjectFactory、ObjectPool和ObjectPoolFactory
Commons-Pool.jar:(参考
)
在Pool组件中,对象池化的工作被划分给了三类对象:
PoolableObjectFactory用于管理被池化的对象的产生、激活、挂起、校验和销毁;
ObjectPool用于管理要被池化的对象的借出和归还,并通知PoolableObjectFactory完成相应的工作;
ObjectPoolFactory则用于大量生成相同类型和设置的ObjectPool。
相应地,使用Pool组件的过程,也大体可以划分成“创立PoolableObjectFactory”、“使用ObjectPool”和可选的“利用ObjectPoolFactory”三种动作。
创立PoolableObjectFactory
Pool组件利用PoolableObjectFactory来照看被池化的对象。ObjectPool的实例在需要处理被池化的对象的产生、激活、挂起、校验和销毁工作时,就会调用跟它关联在一起的PoolableObjectFactory实例的相应方法来操作。
PoolableObjectFactory是在org.apache.commons.pool包中定义的一个接口。实际使用的时候需要利用这个接口的一个具体实现。Pool组件本身没有包含任何一种PoolableObjectFactory实现,需要根据情况自行创立。
创立PoolableObjectFactory的大体步骤是:
创建一个实现了PoolableObjectFactory接口的类。
import org.apache.commons.pool.PoolableObjectFactory; public class PoolableObjectFactorySample implements PoolableObjectFactory { private static int counter = 0; }
为这个类添加一个Object makeObject()方法。这个方法用于在必要时产生新的对象。
public Object makeObject() throws Exception { Object obj = String.valueOf(counter++); System.err.println("Making Object " + obj); return obj; }
为这个类添加一个void activateObject(Object obj)方法。这个方法用于将对象“激活”――设置为适合开始使用的状态。
public void activateObject(Object obj) throws Exception { System.err.println("Activating Object " + obj); }
为这个类添加一个void passivateObject(Object obj)方法。这个方法用于将对象“挂起”――设置为适合开始休眠的状态。
public void passivateObject(Object obj) throws Exception {
System.err.println("Passivating Object " + obj);
}
为这个类添加一个boolean validateObject(Object obj)方法。这个方法用于校验一个具体的对象是否仍然有效,已失效的对象会被自动交给destroyObject方法销毁
public boolean validateObject(Object obj) { boolean result = (Math.random() > 0.5); System.err.println("Validating Object " + obj + " : " + result); return result; }
为这个类添加一个void destroyObject(Object obj)方法。这个方法用于销毁被validateObject判定为已失效的对象。
public void destroyObject(Object obj) throws Exception { System.err.println("Destroying Object " + obj); }
使用ObjectPool
有了合适的PoolableObjectFactory之后,便可以开始请出ObjectPool来与之同台演出了。
ObjectPool是在org.apache.commons.pool包中定义的一个接口,实际使用的时候也需要利用这个接口的一个具体实现。Pool组件本身包含了若干种现成的ObjectPool实现,可以直接利用。如果都不合用,也可以根据情况自行创建。具体的创建方法,可以参看Pool组件的文档和源码。
ObjectPool的使用方法类似这样:
生成一个要用的PoolableObjectFactory类的实例。
PoolableObjectFactory factory = new PoolableObjectFactorySample();
利用这个PoolableObjectFactory实例为参数,生成一个实现了ObjectPool接口的类(例如StackObjectPool)的实例,作为对象池。
ObjectPool pool = new StackObjectPool(factory);
需要从对象池中取出对象时,调用该对象池的Object borrowObject()方法。
Object obj = null; obj = pool.borrowObject();
需要将对象放回对象池中时,调用该对象池的void returnObject(Object obj)方法。
pool.returnObject(obj);
当不再需要使用一个对象池时,调用该对象池的void close()方法,释放它所占据的资源。
pool.close();
这些操作都可能会抛出异常,需要另外处理。
另外,ObjectPool接口还定义了几个可以由具体的实现决定要不要支持的操作,包括:
void clear()
清除所有当前在此对象池中休眠的对象。
int getNumActive()
返回已经从此对象池中借出的对象的总数。
int getNumIdle()
返回当前在此对象池中休眠的对象的数目。
void setFactory(PoolableObjectFactory factory)
将当前对象池与参数中给定的PoolableObjectFactory相关联。如果在当前状态下,无法完成这一操作,会有一个IllegalStateException异常抛出。
利用ObjectPoolFactory
有时候,要在多处生成类型和设置都相同的ObjectPool。如果在每个地方都重写一次调用相应构造方法的代码,不但比较麻烦,而且日后修改起来,也有所不便。这种时候,正是使用ObjectPoolFactory的时机。
ObjectPoolFactory是一个在org.apache.commons.pool中定义的接口,它定义了一个称为ObjectPool createPool()方法,可以用于大量生产类型和设置都相同的ObjectPool。
Pool组件中,对每一个ObjectPool实现,都有一个对应的ObjectPoolFactory实现。它们相互之间,有一一对应的参数相同的构造方法。使用的时候,只要先用想要的参数和想用的ObjectPoolFactory实例,构造出一个ObjectPoolFactory对象,然后在需要生成ObjectPool的地方,调用这个对象的createPool()方法就可以了。日后无论想要调整所用ObjectPool的参数还是类型,只需要修改这一处,就可以大功告成了。
import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.ObjectPoolFactory; import org.apache.commons.pool.PoolableObjectFactory; import org.apache.commons.pool.impl.StackObjectPoolFactory; public class ObjectPoolFactorySample { public static void main(String[] args) { Object obj = null; PoolableObjectFactory factory = new PoolableObjectFactorySample(); ObjectPoolFactory poolFactory = new StackObjectPoolFactory(factory); ObjectPool pool = poolFactory.createPool(); try { for(long i = 0; i < 100 ; i++) { System.out.println("== " + i + " =="); obj = pool.borrowObject(); System.out.println(obj); pool.returnObject(obj); } obj = null; } catch (Exception e) { e.printStackTrace(); } finally { try{ if (obj != null) { pool.returnObject(obj); } pool.close(); } catch (Exception e){ e.printStackTrace(); } } } }
Commons-FileUpload.jar:
FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力。
上传文件到指定的目录。
上传文件到指定的目录,并限定文件大小。
利用 Servlet 来实现文件上传。(参考 )
servlet
package com.zj.sample; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("serial") public class Upload extends HttpServlet { private String uploadPath = "D:\\temp"; // 上传文件的目录 private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录 File tempPathFile; @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);// 设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile.getName()); fi.write(savedFile); } } System.out.print("upload succeed"); } catch (Exception e) { // 可以跳转出错页面 e.printStackTrace(); } } public void init() throws ServletException { File uploadFile = new File(uploadPath); if (!uploadFile.exists()) { uploadFile.mkdirs(); } File tempPathFile = new File(tempPath); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } } }
html
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> // action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置. <form name="myform" action="fileupload" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html>
web.xml
<servlet> <servlet-name>Upload</servlet-name> <servlet-class>com.zj.sample.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>Upload</servlet-name> <url-pattern>/fileupload</url-pattern> </servlet-mapping>
发表评论
-
Java文件读写数据流
2012-08-30 20:30 3662数据流可分节点流( ... -
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
2012-04-16 19:59 24846前言在平时开发、测试过程中、甚至是生产环境中,有时会遇到Out ... -
apache2.2+tomcat超时503
2012-03-26 10:35 3382最近apache2.2+tomcat5.5.28(两个) ... -
Tomcat与apache2集群的问题
2012-03-16 14:53 2427最近在Tomcat与apache2集群的问题的应用程序中 ... -
JVM的参数设置的一个要点
2012-03-11 00:07 2499JVM参数的设置(特别是 –Xmx –Xms –Xmn ... -
【转载】理解Heap Profling名词-Shallow和Retained Sizes
2012-03-06 17:22 2871转载请注明原文链接:h ... -
更改eclipse author的默认名字(作者)
2011-09-07 12:39 1631在eclipse的目录下找到eclipse.in ... -
【转载】java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-08-27 12:18 1207java.lang.OutOfMemoryError: P ... -
JAVA NIO
2011-08-19 22:25 669NIO流是一个比IO流(字节字符)效率高很多,因为是以块 ... -
XMLGregorianCalendar 与 Date 转换
2011-06-28 17:01 1895XMLGregorianCalendar 与 Date ... -
Web Service 的描述语言WSDL说明
2011-05-27 10:28 1172<?xml version="1. ... -
spring+quartz的配置文件
2011-05-26 21:23 1195spring+quartz的配置文件 &l ... -
JAVA调用Shell脚本--及阻塞的解决办法
2011-05-16 13:13 8685用java调用shell,使用 Process p=Runt ... -
WIN7安装WebSphere6.1
2011-03-23 12:55 0首先是安装,我们决定安装WebSphere6.1。 ... -
Jbpm4常用操作
2011-03-06 15:00 2604Jbpm4常用操作 一、ProcessEngine:流程 ... -
ThreadLocal
2010-11-08 21:40 829ThreadLocal -
小记--tomcat 常见问题
2010-10-12 22:29 11161. tomcat 6 undepl ... -
SimpleDateFormat用法说明
2010-09-19 13:02 1390关于java.text.SimpleDateFormat。 ... -
常用的jar包总结(3)
2010-08-11 23:27 1996最近用新的一套web框架做项目,有很多常用的包集成在里面 ... -
常用的jar包总结(2)
2010-08-11 23:27 1859最近用新的一套web框架做项目,有很多常用的包集成在里面 ...
相关推荐
微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用...
一般常用的jar包总结
希望能够帮助到大家,一点小小的总结,里面包含了freemarker包和其他常用web开发包
自己总结的struts常用jar包和配置文件的简单编写,其中包括项目的web.xml和struts.xml,给初学者很好礼物!
个人在学习中总结的Java开发常用jar包,或有不全敬请包涵
自己总结的java项目打包,软件加自己总结打包步骤
ssh三大框架整合让很多人很头疼,这里我总结了所用的jar包,如要扩展请大家自己添加其他jar包。
在做webservice的过程中,总结的常用webservice的jar包,wsdl4j-1.6.1.jar、wstx-asl-3.2.0.jar、xfire-all-1.2.6.jar、XmlSchema-1.4.2.jar,jdom.jar,emayclient.jar,commons-codec-1.5.jar
使用Spring4框架时,对于使用不同的功能来导入不同的jar包的总结
早一段时间学习了springsecurity3.0 框架,在开始阶段不知道导入那些必需jar包,经过摸索,总结出来最精简的jar包
JPA开发所需jar包总结
这个压缩包包含了SSH框架的的一些jar包,是自己写ssh项目总结出来的,小伙伴们有兴趣可以下载哟。
axis2客户端需要的jar包总结,包含axis2客户端搭建需要的全部jar包。
包括mysql oracle sqlserver sqlserver2005 在内的各驱动jar包。并且为大家总结了java连接各类数据库的方法。希望对大家有所帮助。
使用json格式的数据需要的jar包,除了本身的jar包,还有一些需要依赖的jar包 总结一下包括: 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar ...
Java使用EasyExcel操作Excel表格的相关jar包,总结的一些包,想要的兄弟们来下载把!!
spring比较全面的jar包,整合项目必用,在项目开发中,我也曾经遇到jar包冲突,缺少jar等问题,这是我自己总结出来的jar。各位大佬不要嫌弃小弟渣
这是本人在尝试好多次后总结的三大框架整合时所需的jar包,解决了三大框架初学者因为jar问题导致错误而找不到原因的问题,欢迎初学者下载。
使用Axis开发Webservice时,需要用到相应的jar包,总结我们项目中的jar包,分享学习!
在进行ssh开发环境搭建的时候,要不断挑选需咬掉jar包,很是麻烦,这里总结了ssh开发环境搭建的基础jar包,以后需要那个jar包在添加就行了