glassfish和tomcat的效率哪个好

glassfish和tomcat的效率哪个好,第1张

1,机器CPU Intel Core T2050(挺差的那种),内存1.5G。

2,测试工具:JMeter 2.2。

3,数据库:Mysql 5.1.25。

4,测试代码:开发的中型项目,并用了开源数据库连接池DBCP。

5,测试脚本:用Badboy录制,并用50个线程,循环2次。

6,glassfish:glassfishv3-tp2,采用默认配置。

7,tomcat:jakarta-tomcat-5.5.9,采用默认配置。

保证了除了一个用应用服务器glassfish,一个用WEB服务器tomcat外,其他环境一样。

首先测试了glassfish,再测试tomcat,并在测试过程中对tomcat截图:

在运行的过程中,glassfish内存占用170-190M,CPU占用50%-70%,tomcat内存占用90-110M,CPU占用0%-60%不等,mysql占用CPU10%-20%。

如果从并发量角度来说,一般tomcat采用tomcat+apache来负载,网上有glassfish与tomcat+apache的压力测试,前者的处理并发的效率总体在后者的十倍以上

一,开发工具的选择

Java

EE,或者是JSF应用开发,Netbeans和Glassfish是最好的搭配选择,前者对于后者有非常好的支持。但要注意netbeans的版

本,5.5是不支持glassfish v2的。而netbeans6还很不稳定,所以现阶段最好的版本是netbeans5.5.1。

关于Netbeans下开发Java EE应用,官方有文档介绍:Java EE 应用程序相关教程,这里主要介绍一下生产环境中web应用在glassfish下的部署和配置

二,下载安装Glassfish V2

1)下载Glassfish v2并解压缩。下载完毕後,执行以下命令:

java -Xmx256m -jar glassfish_filename.jar

点击接受d出的协议后(这里sun比较无聊啊,所有软件都是,明明一个普通压缩包,非压成jar让你看一下协议才行),glassfish会解压到一个名为glassfish的目录里。

2) 修改端口

glassfish是通过ant来安装的,安装脚本在setup.xml下,在里面可以修改一些配置,比如端口等等。在setup.xml中主要有以下设置:

xml 代码

﹤property name="domain.name" value="domain1"/﹥域名

﹤property name="instance.name" value="server"/﹥

﹤property name="admin.user" value="admin"/﹥ 管理员用户名 

﹤property name="admin.password" value="adminadmin"/﹥ 管理员密码 

﹤property name="admin.port" value="4848"/﹥ 管理平台端口 

﹤property name="instance.port" value="8080"/﹥ 实例端口,也就是通过这个端口来访问web应用 

﹤property name="orb.port" value="3700"/﹥

﹤property name="imq.port" value="7676"/﹥

﹤property name="https.port" value="8181"/﹥ https端口

根据需要修改以上设置,执行:ant -f setup.xml,如果系统没有安装ant,在glassfish\lib\ant下有一个ant1.6版。安装结束后,进入glassfish/bin下,在控制台执行下面命令启动glassfish:

asadmin start-domain domain1 // domain1是上面设置的domain.name,系统默认domain1

启动结束后,进入http://localhost:8080测试是否已经正确启动

asadmin stop-domain domain1  //停止服务器

三,部署web应用

有三种方式,可以直接将war或ear放在glassfish/domain/autodeploy目录下,glassfish启动后会自动部署。

第二是通过命令asadmin deploy部署应用, 另外 asadmin updeploy 卸载应用。通过asadmin deploy

--help 和 asadmin undeploy --help 获得更多帮助。

第三是通过我推荐的方式,通过glassfish管理控制台进入http://localhost:4848,默认用户admin,密码adminadmin。打开後看到如下界面:

进入左侧菜单, Applications ->Web

Applications,在列表中可以看到已经部署的应用,如要部署新应用,点击deploy按钮,选择本地的war,设定好context

path,点击OK,无论部署成功或失败,都会看到相应的信息提示

注:通过这种方式,可以进行远程部署,只要打开目标服务器上的管理控制台,选择一个本地的war,就可以快速的部署到远程服务器上,非常方便,这也是推荐的原因。对于EJB应用,在Enterprise Applications下部署,方法同上

四,配置jdbc数据源

对于Java EE应用,经常需要事先设定数据源,否则部署时会报javax.naming.NameNotFoundException

配置方法是进入Resources ->JDBC,会看到JDBC Resources和Connection pools

先设定Connection

pools,以MySql为例,点击New,命名为MySqlPools,ResourceType选择

javax.sql.ConnectionPoolDataSource,Database

vendor肯定选择mysql,然后点击next进入下一页面。最主要的是设定Additional

Properties,也就是jdbc连接配置,设定好url, user,

password,其他的保持默认值,也可以根据需要自己添加属性。设定好连接池后,接着设定JDBC

Resources,新建一个JDBC,名称要和你的web应用里的持久化单元采用的数据源的名称一致。

然后再次部署web应用,就会正常运行了。

在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难。最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难搞。在上一篇中,我探讨了SpringSide 3 中的数据访问层,在这一篇中,我立志要解决多数据源配置的难题,我的思路是这样的:

第一步、测试能否配置多个DataSource

第二步、测试能否配置多个SessionFactory

第三步、测试能否配置多个TransactionManager

第四步、测试能否使用多个TransactionManager,也就是看能否配置多个

基本上到第四步就应该走不通了,因为Spring中似乎不能配置多个,而且@transactional注解也无法让用户选择具体使用哪个TransactionManager。也就是说,在SpringSide的应用中,不能让不同的数据源分别属于不同的事务管理器,多数据源只能使用分布式事务管理器,那么测试思路继续如下进行:

第五步、测试能否配置JTATransactionManager

如果到这一步,项目还能顺利在Tomcat中运行的话,我们就算大功告成了。但我总认为事情不会那么顺利,我总觉得JTATransactionManager需要应用服务器的支持,而且需要和JNDI配合使用,具体是不是这样,那只有等测试后才知道。如果被我不幸言中,那么进行下一步:

第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager

下面测试开始,先假设场景,还是继续用上一篇中提到的简单的文章发布系统,假设该系统运行一段时间后非常火爆,单靠一台服务器已经无法支持巨大的用户数, 这时候,站长想到了把数据进行水平划分,于是,需要建立一个索引数据库,该索引数据库需保存每一篇文章的Subject及其内容所在的Web服务器,而每 一个Web服务器上运行的项目,需要同时访问索引数据库和内容数据库。所以,需要创建索引数据库,如下:

[java] view plain copy

create database puretext_index

use puretext_index

create table articles(

id int primary key auto_increment,

subject varchar(256),

webserver varchar(30)

)

第一步测试,配置多个DataSource,配置文件如下:

application.properties:

[java] view plain copy

jdbc.urlContent=jdbc:mysql://localhost:3306/PureText useUnicode=true&characterEncoding=utf8

jdbc.urlIndex=jdbc:mysql://localhost:3306/PureText_Index useUnicode=true&characterEncoding=utf8

applicationContext.xml:

[java] view plain copy

<xml version="1.0" encoding="UTF-8" >

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" default-lazy-init="true" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<description>Spring公共配置文件 </description>

<!-- 定义受环境影响易变的变量 -->

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE">

<property name="ignoreResourceNotFound" value="true">

<property name="locations">

<list>

<!-- 标准配置 -->

<value>classpath*:/application.properties</value>

<!-- 本地开发环境配置 -->

<value>classpath*:/application.local.properties</value>

<!-- 服务器生产环境配置 -->

<!---->file:/var/myapp/application.server.properties -->

<!--!----></list>

</property>

</property></property></bean>

<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->

<context:component-scan base-package="cn.puretext">

<!-- 数据源配置,使用应用内的DBCP数据库连接池 -->

<bean id="dataSourceContent" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<!-- Connection Info -->

<property name="driverClassName" value="com.mysql.jdbc.Driver">

<property name="url" value="${jdbc.urlContent}">

<property name="username" value="${jdbc.username}">

<property name="password" value="${jdbc.password}">

<!-- Connection Pooling Info -->

<property name="initialSize" value="5">

<property name="maxActive" value="100">

<property name="maxIdle" value="30">

<property name="maxWait" value="1000">

<property name="poolPreparedStatements" value="true">

<property name="defaultAutoCommit" value="false">

</property></property></property></property></property></property></property></property></property></property></bean>

<bean id="dataSourceIndex" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<!-- Connection Info -->

<property name="driverClassName" value="com.mysql.jdbc.Driver">

<property name="url" value="${jdbc.urlIndex}">

<property name="username" value="${jdbc.username}">

<property name="password" value="${jdbc.password}">

<!-- Connection Pooling Info -->

<property name="initialSize" value="5">

<property name="maxActive" value="100">

<property name="maxIdle" value="30">

<property name="maxWait" value="1000">

<property name="poolPreparedStatements" value="true">

<property name="defaultAutoCommit" value="false">

</property></property></property></property></property></property></property></property></property></property></bean>

<!-- 数据源配置,使用应用服务器的数据库连接池 -->

<!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB">-->

<!-- Hibernate配置 -->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource" ref="dataSourceContent">

<property name="namingStrategy">

<bean class="org.hibernate.cfg.ImprovedNamingStrategy">

</bean></property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>

<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>

<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider

</prop>

<prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop>

</props>

</property>

<property name="packagesToScan" value="cn.puretext.entity.*">

</property></property></bean>

<!-- 事务管理器配置,单数据源事务 -->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory">

</property></bean>

<!-- 事务管理器配置,多数据源JTA事务-->

<!-- id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or

WebLogicJtaTransactionManager">

-->

<!-- 使用annotation定义事务 -->

<tx:annotation-driven transaction-manager="transactionManager">

</tx:annotation-driven><!--!----><!--!--<jee:jndi-lookup--></context:component-scan></beans>


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10646308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存