tomcat服务器维护心得

作为一个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:位置添加到哪里都无所谓,只要起作用就行):

tomcat服务器维护心得_第1张图片

(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个属性

   

               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

                     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 事务配置

 
 
  
   
  

  
   
    org.hibernate.dialect.OracleDialect
    true
    true
    50
    50
    false
    org.hibernate.cache.EhCacheProvider
   

  

  
   
     classpath:com\cg\framework\common\security\po
     classpath:com\cg\framework\common\config\po
   

  

 

 
 
 
   
 

 
 
       
 

 
       
 

   
 
       
       
   

 
 
 
   // Service表示事物切面位于服务层
 

 
  
       //此处 rollback-for="Exception"表示,只要抛出异常就进行回滚,因为所有异常都是Exception的子类。

    

   
   
   
   
   
  
  

(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失效时间

 
    
 120  //此处120是指120分钟,并不是大多数情况下以秒为单位。
 

5.oracle数据库锁表    

有时造成系统无法正常运行的原因可能是,锁表,这里稍微提一下。

select * from v$locked_object;

你可能感兴趣的:(Java)