下面的代码会出来内存溢出。但是这个是书上面的代码。问题出现在哪。二级缓存已经关闭了
private void testUser()throws Exception
{
//打开Session
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
//循环100000次,插入100000条记录
for (int i = 0 ; i < 100000 ; i++ )
{
//创建User实例
UserInsert u1 = new UserInsert();
u1.setName("xxxxx" + i);
u1.setAge(i);
u1.setNationality("china");
//在Session级别缓存User实例
session.save(u1);
//每当累加器是20的倍数时,将Session中数据刷入数据库,
//并清空Session缓存。
if (i % 20 == 0)
{
session.flush();
session.clear();
}
}
//提交事务
tx.commit();
//关闭事务
HibernateUtil.closeSession();
}

解决方案 »

  1.   

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.microsoft.sqlserver.jdbc.TDSPacket.<init>(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
    at lee.UserInsertManager.testUser(UserInsertManager.java:46)
    at lee.UserInsertManager.main(UserInsertManager.java:27)
      

  2.   

    看看hibernate的源码研究下实现原理,说不定能找出原因
      

  3.   

    楼主eclipse的内存不够,在启动参数加上 -Xms64M -Xmx512M,这里512为eclipse所有内存,越大越好,最好和没启动eclipse的大部份物理内存。
      

  4.   

    接近创建了十万多个对象....
    肯定溢出了...
    //创建User实例
    UserInsert u1 = new UserInsert(); 把这个对象复用可以巴?
      

  5.   

    正解
    你把UserInsert u1 = new UserInsert();这句 挪到循环外面试试
    实在不行 就用存储过程插入吧