tomcat服务器维护心得
作为一个java开发菜鸟,维护了几个月公司内部项目,项目是通过tomcat6.0t发布的,服务器使用linux操作系统,数据库是oracle10g,框架采用标准的SSH框架,开发使用MyEclipse8.5,过程很纠结,在这里吧这段时间遇到的问题和解决方法分享一下。1.tomcat内存修改通过以下现象,可以初步判断JVM内存不足:程序抛异常,java.lang.OutOfMemoryE
作为一个java开发菜鸟,维护了几个月公司内部项目,项目是通过tomcat6.0t发布的,服务器使用linux操作系统,数据库是oracle10g,框架采用标准的SSH框架,开发使用MyEclipse8.5,过程很纠结,在这里吧这段时间遇到的问题和解决方法分享一下。
1.tomcat内存修改
通过以下现象,可以初步判断JVM内存不足:
程序抛异常,java.lang.OutOfMemoryError: Java heap space。
进入tomcat \manager\status 管理界面 查看JVM标签下的信息,当Free memory 空闲内存接近 0 ,Total menory 全部内存 接近 Max memory最大内存。这是系统反应很慢,
长时间保持在这一个状态可以说明,内存不足,需要调整java程序运行过程中JVM可以调配使用的内存空间的大小(ps:可能有的程序没有释放内存也可能导致之一情况)。
解决办法:
(1)tomcat
如果你用win
/tomcat/bin/catalina.bat 加上下面的命令: set JAVA_OPTS=-Xms32m -Xmx256m
如果你用unix/linux
/tomcat/bin/catalina.sh 加上下面的命令: JAVA_OPTS="-Xms32m -Xmx256m"
添加位置如下图(ps:位置添加到哪里都无所谓,只要起作用就行):
(2)MyEclipse
启动MyEclipse启动Tomcat无视catalina.bat中设置内存大小的问题。
在tomcat的catalina.bat中设置set JAVA_OPTS=-Xms128m-Xmx256m,直接使用startup.bat启动tomcat没有问题。但是在myeclipse中配置tomcat后,通过myeclipse启动就
出现内存溢出,之前在catalina.bat中设置的内存似乎没有作用。
解决方法:窗口->首选项->MyEcliipse->ApplicationServers->Tomcat->Tomcat5.x->JDK->OptionalJava VM arguments中填写一下内容。
-Xms128m -Xmx256m
-Dcom.sun.management.jmxremote=true
内存具体大小视具体情况制定。
2.tomcat线程池连接数修改
通过以下现象,可以初步判断tomcat线程池连接数不足:
Max threads最大线程数,Current thread当前线程线与Current thread busy当前忙碌线程相等。可以初步判断线程池连接数不足。(ps:程序连接不释放可以引起这样问题)
解决办法:
修改tomcat/conf/server.xml,在线程池节点下添加或者修改以下3个属性
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="600" ///最大线程数
minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
...... />
3.oracle数据库session数修改
通过以下现象,可以初步判断oracle设置的processes和session数不足:
tomcat抛出无法分发客户端连接的异常,oracle进程数不够无法连接上。
解决办法:
(1)查看processes和session
sql> select count(*) from v$process;
sql> select count(*) from v$session;
(2)修改processes和session
sql> alter system set processes= 300 scope=spfile;
sql> alter system set sessions= 555 scope=spfile;
(3)oracle的连接数(session)与其参数文件中的进程数(process)有关,它们的关系如下:
sessions = (1.1*process+5)
ps:这两个参数需要重启数据库服务才能实现修改。
4.程序连接oracle数据库连接不释放
连接不释放的产生原因有很多种,一般都是由于代码编写不规范造成的,这里不再阐述,只列出尝试解决的几种办法。
(1)Spring dataSource数据源配置 Spring 事务配置
修改Spring 配置文件 applicationContext.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="oracle.jdbc.driver.OracleDriver" p:url="jdbc:oracle:thin:@localhost:1521:oracle"
p:username="username" p:password="username"
p:maxActive="200" p:maxIdle="30" // 最大连接数量200,初始30。
p:removeAbandoned="true" // 如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)。
p:removeAbandonedTimeout="600" // 设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。
p:logAbandoned="true" // 输出回收的日志,可以详细打印出异常从而发现是在那里发生了泄漏。
p:maxWait="10000" />
(2)Spring 事务配置
<!-- sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">50</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com\cg\framework\common\security\po</value>
<value>classpath:com\cg\framework\common\config\po</value>
</list>
</property>
</bean>
<!-- 定义HibernateTemplate模板 -->
<bean id="template" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置JDBC操作模型 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg><ref bean="dataSource"/></constructor-arg>
</bean>
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg><ref bean="dataSource"/></constructor-arg>
</bean>
<!-- 配置事务-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="dataSource" ref="dataSource"/>
</bean>
<aop:aspectj-autoproxy/>
<aop:config>
<aop:advisor pointcut="execution(* com.cg.framework.common..*Service*.*(..))" advice-ref="txAdvice"/> // Service表示事物切面位于服务层
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/> //此处 rollback-for="Exception"表示,只要抛出异常就进行回滚,因为所有异常都是Exception的子类。
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="pageQuery" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
(3)规范daoImpl层代码,仅仅使用Spring提供的3个模板,规范方法名称使其符合特定的事物。
HibernateTemplate模板
JdbcTemplate模板
SimpleJdbcTemplate
如果需要调用存储过程则使用以下方式:
Connection conn = SessionFactoryUtils.getDataSource(template.getSessionFactory()).getConnection();
CallableStatement cs = conn.prepareCall("{call PRO_PRO(?,?,?,?) }");
cs.setString(1, f.getsName());
cs.setString(2, f.getDwName());
cs.setString(3, f.getDateEnd());
cs.registerOutParameter(4,OracleTypes.CURSOR );
cs.execute();
ResultSet rs =(ResultSet) cs.getObject(4);
rs.close(); //此处需要手动关闭连接
cs.close();
conn.close();
(4)配置web.xml ,设置session失效时间
<!-- 设置session失效时间 -->
<session-config>
<session-timeout>120</session-timeout> //此处120是指120分钟,并不是大多数情况下以秒为单位。
</session-config>
5.oracle数据库锁表
有时造成系统无法正常运行的原因可能是,锁表,这里稍微提一下。
select * from v$locked_object;
更多推荐
所有评论(0)