我写的一个表管理接口项目,在自己机器测试时十分正常,当发布到服务器时就出这个问题。下面是我的Spring配置文件<?xml version="1.0" encoding="GBK"?>
<!-- 指定Spring配置文件的Schema信息 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
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/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    
    <context:annotation-config />
    <context:component-scan base-package="com.*"></context:component-scan>
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="oracle.jdbc.OracleDriver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.5.3:1521:hr"/>
<!-- <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"/> -->
<!-- 指定连接数据库的用户名 -->
<property name="user" value="hrsmx"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="hr123456"/>
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="7"/>
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
<!-- 定义Hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 依赖注入数据源,注入正是上面定义的dataSource -->
<property name="dataSource" ref="dataSource"/>
<!-- mappingResouces属性用来列出全部映射文件 -->
<property name="mappingResources">
<list>
<!-- 以下用来列出Hibernate映射文件-->
<value>com/model/Interface_Column.hbm.xml</value>
<value>com/model/Interface_Group.hbm.xml</value>
<value>com/model/Interface_Error.hbm.xml</value>
<value>com/model/Interface_Table.hbm.xml</value>
<value>com/model/UserInfo.hbm.xml</value>
<value>com/model/Dic_code_gb_list.hbm.xml</value>
<value>com/model/Dic_code_gb.hbm.xml</value>
<value>com/model/Dic_code_hr.hbm.xml</value>
<value>com/model/Dic_code_nh.hbm.xml</value>
<value>com/model/Dic_code_nh_list.hbm.xml</value>
<value>com/model/Dic_code_hr_list.hbm.xml</value>
<value>com/model/Dic_code_hr_extend.hbm.xml</value>
<value>com/model/Dic_code_icd10.hbm.xml</value>
<value>com/model/Dic_code_hr_extend_list.hbm.xml</value>
<value>com/model/Dic_code_medical.hbm.xml</value>
<value>com/model/Dic_code_ops.hbm.xml</value>
<value>com/model/Dic_code_treat.hbm.xml</value>
<value>com/model/Dic_nh_check_limit.hbm.xml</value>
<value>com/model/Dic_gb_area.hbm.xml</value>
<value>com/model/Dic_organ_type.hbm.xml</value>
<value>com/model/Dic_hr_area_local.hbm.xml</value>
<value>com/model/DocManage.hbm.xml</value>
</list>
</property>
<!-- 定义Hibernate的SessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定数据库方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect</prop>
<!-- 是否根据需要每次自动创建数据库 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<prop key="hibernate.show_sql">false</prop>
<!-- 将SQL脚本进行格式化后再输出 -->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->
<!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现-->
<bean id="transactionManager" 
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置事务切面Bean,指定事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 用于配置详细的事务语义 -->
<tx:attributes>
<!-- 所有以'get'开头的方法是read-only的 -->
<tx:method name="get*" read-only="true"/>
<!-- 其他方法使用默认的事务设置 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 配置一个切入点,匹配lee包下所有以Impl结尾的类
执行的所有方法 -->
<aop:pointcut id="leePointcut"
expression="execution(* com.service.*Service.*(..))"/>
<!-- 指定在txAdvice切入点应用txAdvice事务切面 -->
<aop:advisor advice-ref="txAdvice" 
pointcut-ref="leePointcut"/>
</aop:config>

<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource">
       <ref bean="dataSource"/>
     </property>
    </bean>
  </beans>  下面是可能造成内存溢出的类  不管里面该关闭的都关闭了.实在是找不出问题
package com.dao.impl;import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.dao.TableRecordDao;public class TableRecordDaoImpl extends HibernateDaoSupport implements TableRecordDao{ public List<String> getObject(String sql) {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
conn=session.connection();
List<String> list=new ArrayList<String>();
try {
st=conn.createStatement();
rs=st.executeQuery(sql);
while(rs.next()){
list.add(rs.getString("col_name"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try{
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
releaseSession(session);
}

return list;
}

public List<Map> getMap(String sql,List<String> lists){
Connection conn=null;
Statement st=null;
ResultSet rs=null;
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
conn=session.connection();
List<Map> list=new ArrayList<Map>();
try {
st=conn.createStatement();
rs=st.executeQuery(sql);
while(rs.next()){
Map map=new HashMap();
for(int i=0;i<lists.size();i++){
    map.put(lists.get(i), rs.getString(lists.get(i)));
}
list.add(map);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try{
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
releaseSession(session);
}
return list;
}}还有我机器上是解压版的 tomcat6.0  服务器是安装版的tomcat6.0在网上查找相关问题,看到这么说的,因为引用第三方ja包太多导致的 而jvm的PermGen space默认大小是4M可以利用java -XX:PermSize=128m -XX:MaxPermSize=256m  可以解决这个和问题,但是经过设置后,还是没有解决,很迷茫!

解决方案 »

  1.   

    永久堆是java用来存放类等的信息的,默认的一般比较小,你把它改大试试。-XX:MaxPermSize=  
      

  2.   

    一是调大 java 堆尺寸,-Xmx1024m 或更大,
    二是分批处理数据,不要一次就把所有数据处理完。这种方案可以很好地适应前面方案在将来数据增大时又出问题的风险。
      

  3.   

    安装版的tomcat6.0 一般不会出现此问题...解压版的tomcat x.x只是适用于DEBUG时候....原因:
    解压版本只包含了tomcat仅能运行并调试的核心liberty,一般解压版本是为了升级低版本的时候使用的..所以溢出属于正常情况