- 浏览: 256087 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
郑涵魁:
这才是好文啊
一次使用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 3716数据流可分节点流( ... -
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
2012-04-16 19:59 25036前言在平时开发、测试过程中、甚至是生产环境中,有时会遇到Out ... -
apache2.2+tomcat超时503
2012-03-26 10:35 3418最近apache2.2+tomcat5.5.28(两个) ... -
Tomcat与apache2集群的问题
2012-03-16 14:53 2473最近在Tomcat与apache2集群的问题的应用程序中 ... -
JVM的参数设置的一个要点
2012-03-11 00:07 2553JVM参数的设置(特别是 –Xmx –Xms –Xmn ... -
【转载】理解Heap Profling名词-Shallow和Retained Sizes
2012-03-06 17:22 2912转载请注明原文链接:h ... -
更改eclipse author的默认名字(作者)
2011-09-07 12:39 1669在eclipse的目录下找到eclipse.in ... -
【转载】java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-08-27 12:18 1248java.lang.OutOfMemoryError: P ... -
JAVA NIO
2011-08-19 22:25 708NIO流是一个比IO流(字节字符)效率高很多,因为是以块 ... -
XMLGregorianCalendar 与 Date 转换
2011-06-28 17:01 1929XMLGregorianCalendar 与 Date ... -
Web Service 的描述语言WSDL说明
2011-05-27 10:28 1205<?xml version="1. ... -
spring+quartz的配置文件
2011-05-26 21:23 1229spring+quartz的配置文件 &l ... -
JAVA调用Shell脚本--及阻塞的解决办法
2011-05-16 13:13 8838用java调用shell,使用 Process p=Runt ... -
WIN7安装WebSphere6.1
2011-03-23 12:55 0首先是安装,我们决定安装WebSphere6.1。 ... -
Jbpm4常用操作
2011-03-06 15:00 2645Jbpm4常用操作 一、ProcessEngine:流程 ... -
ThreadLocal
2010-11-08 21:40 856ThreadLocal -
小记--tomcat 常见问题
2010-10-12 22:29 11521. tomcat 6 undepl ... -
SimpleDateFormat用法说明
2010-09-19 13:02 1423关于java.text.SimpleDateFormat。 ... -
常用的jar包总结(3)
2010-08-11 23:27 2055最近用新的一套web框架做项目,有很多常用的包集成在里面 ... -
常用的jar包总结(2)
2010-08-11 23:27 1906最近用新的一套web框架做项目,有很多常用的包集成在里面 ...
相关推荐
"maven常用Jar包"指的是在Java开发中频繁使用的第三方库,例如Spring框架、Hibernate ORM、Apache Commons系列库、JSON解析库如Jackson或Gson,以及测试框架JUnit等。这些库已经被广泛地接受并应用在各种项目中,...
总结来说,SSH框架的常用Jar包涵盖了Web开发的多个方面,从控制层(Struts2)到业务层(Spring)再到数据访问层(Hibernate),为开发者提供了一整套完善的解决方案。理解并熟练运用这些Jar包,将有助于提升开发效率...
在本知识点中,我们将深入探讨Spring 4.3.9版本以及与其相关的开发常用jar包,特别是日志jar包在Spring框架搭建和测试中的作用。 首先,Spring框架的核心jar包包括`spring-core.jar`、`spring-beans.jar`、`spring-...
总结来说,这个“Java开发常用jar包”资源集成了Java开发中必不可少的工具和库,涵盖了项目管理、数据交换、数据库连接、NoSQL支持以及Web框架等多个方面,为Java开发者提供了一站式的开发支持。使用这些库,开发者...
微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用的jar包总结和归纳微信开发需要用...
"android常用jar包"这个主题涵盖了几个重要的库,包括处理JSON数据的库、XML解析库以及一个UI组件库。让我们详细了解一下这些jar包及其在Android开发中的作用。 首先,我们来看`json-jar.zip`。这通常指的是一个...
总结,`jar`包在Web开发中扮演着核心角色,提供了一种高效、便捷的方式来管理和使用代码资源。无论是基础的API库,还是复杂的框架和第三方库,`jar`包都是构建Web应用的基础。通过理解`jar`包的工作原理和使用方式,...
本知识点将深入探讨Java与SQL Server交互的关键技术和相关jar包。 首先,为了在Java程序中与SQL Server数据库进行通信,我们需要使用JDBC(Java Database Connectivity)驱动。JDBC是Java平台中用于访问数据库的...
总结来说,"Struts 2常用jar包"是构建基于Struts 2的Web应用所必需的类库,它们协同工作,为开发者提供了强大的MVC框架支持,包括请求处理、数据绑定、视图渲染以及丰富的客户端交互能力。正确理解和使用这些库,...
以下是我个人总结的打包流程,包括如何处理项目中的第三方jar包,确保程序运行时能够正确加载所有依赖。 **步骤一:安装exe4j** 首先,我们需要下载并安装exe4j。exe4j的安装包可以在其官方网站获取。安装过程中...
总结一下,"junit4 jar包"是Java开发中不可或缺的一部分,它提供了一套完善的单元测试工具和API,帮助开发者确保代码的质量和稳定性。通过`junit-4.11.jar`和`hamcrest-core-1.3.jar`这两个关键库,我们可以编写出...
总结来说,Java JAR包在Android SSH环境下扮演了重要角色,提供了实现远程控制、自动化任务和安全通信的能力。开发者应熟悉如何正确使用和管理JAR包,以优化项目结构,提升应用性能,并确保安全性。
"一般常用的jar包总结"这个主题旨在概述那些在Java应用开发中频繁使用的JAR库。这些库为开发者提供了丰富的功能,减少了重复工作,提高了开发效率。 1. **Apache Commons**: - Apache Commons是Apache软件基金会...
总结来说,"spark相关jar包"涵盖了Spark框架的各个组件以及它们所需的依赖,理解这些jar包的作用和使用方法对于成功部署和运行Spark应用程序至关重要。开发者需要根据具体项目需求,选择并管理好相应的jar包,确保...
总结来说,Java连接三大数据库——MySQL、Oracle和SQL Server,需要分别使用`mysql-connector-java.jar`、`ojdbc.jar`系列和`sqljdbc4.jar`系列的jar包。这些驱动实现了JDBC接口,使得Java程序能够遵循统一的JDBC...
总结来说,"消息中间件常用的jar包"涵盖了消息队列、网络通信、日志管理等多个方面,是构建高效、稳定、可扩展的消息处理系统的基础。正确理解和使用这些库,能够帮助开发者构建出满足业务需求的高质量系统。
总结一下,这个“modbus必备jar包”提供了所有必要的Java库,用于实现基于Modbus协议的通信。`modbus4j.jar`是核心的Modbus处理库,`seroutils.jar`和`RXTXcomm.jar`则为串口通信提供了支持,而文档和源代码则有助于...
总结起来,"JAVA中常用的jar包"涵盖了从提高JSP开发效率的标准标签库JSTL,到数据库连接的JDBC驱动,以及众多的第三方库。理解并熟练使用这些JAR包对于任何Java开发者来说都是至关重要的,它们能帮助我们编写更简洁...
在做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
总结来说,打包Eclipse项目为JAR并处理外部JAR包和配置文件的关键步骤包括: 1. 使用Eclipse的`Runnable JAR file`导出功能。 2. 选择合适的库处理方式,通常推荐`Package required libraries into generated JAR`。...