作为一个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;

Logo

更多推荐