[求助]Spring+Hibernate大数据量插入DB的问题。

时间:2022-01-15 10:48:23
先有这样一个功能,读取文件,并将文件的内容全部插入到DB中去。
由于文件的数据量很大,有2800000件。
下面是代码,我发现oe = orderEtdDAO.merge(oe);这句语句就会让内存不断的增加,处理到690000件左右的时候就会报错java heap space。而merge()方法已经是hibernate框架里的东西了。
while ((oe = reader.readModel()) != null) {
     actualNumberOfRecords++;

     if (actualNumberOfRecords % 5000 == 0)
      System.out.println(actualNumberOfRecords);

     oe = orderEtdDAO.merge(oe);//就是这一句会让内存激增。
     
     if (actualNumberOfRecords % 50 == 0) {
      orderEtdDAO.flush();
      orderEtdDAO.clear();
     }
     oe = null;
    }

--------------------------------
@SuppressWarnings("unchecked")
@Transactional
public M merge(M value) {
return (M) getHibernateTemplate().merge(value);
}


求教,问题出在哪里?如何解决?
已经扩大jvm可以使用的内存了。-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m

19 个解决方案

#1


这个是出错信息。

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:599)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(AbstractPlatformTransactionManager.java:424)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:353)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy105.merge(Unknown Source)
at au.com.toyota.taipan.domain.services.impl.OrderEtdServiceImpl.importFromFile(OrderEtdServiceImpl.java:68)
at au.com.toyota.taipan.domain.services.impl.OrderEtdServiceImplTest.should_persist_the_order_etds_from_the_source_file_db1(OrderEtdServiceImplTest.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558)
... 34 more
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
localhost:1521:xe

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:280)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:319)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:344)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:148)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:545)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:174)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:165)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
... 39 more

#2


merge是干啥的?

你不能用save吗?

#3


建议还是用jdbc吧。要不你就换个64位至少8G内存的系统。

#4


该回复于2013-05-28 13:39:27被管理员删除

#5


Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
貌似tns有点问题,连不上。可能是因为前面操作时候没有关掉连接的问题,引起溢出。你看看getHibernateTemplate()的session应该有close的方法。你试着修改一下。
hibernate其实效率很不好,你真想高效的话,还是用jdbc比较好!

#6


引用 2 楼 rainbowsix 的回复:
merge是干啥的?

你不能用save吗?


试过save了,结果也一样,就save这一句会让内存增加。

#7


引用 4 楼 feier00 的回复:
打标记打标记打标记

怎么打标记啊?

#8


引用 5 楼 xianwangkai 的回复:
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
貌似tns有点问题,连不上。可能是因为前面操作时候没有关掉连接的问题,引起溢出。你看看getHibernateTemplate()的session应该有close的方法。你试着修改一下。
hibernate其实效率很不好,你真想高效的话,还是用jdbc比较好!


我另外一个表14000多条数据,用相同的处理就插进去了。和tns连接会有关系吗?
另外,这个循环用的应该是同一个session吧?close session的话,在什么时候关呢?

public final HibernateTemplate getHibernateTemplate() {
  return this.hibernateTemplate;
}

public Object merge(final Object entity) throws DataAccessException {
return executeWithNativeSession(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
checkWriteOperationAllowed(session);
return session.merge(entity);
}
});
}

#9


遇到这种大数据量的存储,我一般做法都是,开个线程,然后分批次存储,例如读1000条存储提交,再读1000条存储提交,循环直到结束,慢慢存呗,如果时间不急。很少一次性提交的,谁都受不了。

#10


引用 9 楼 popibbt 的回复:
遇到这种大数据量的存储,我一般做法都是,开个线程,然后分批次存储,例如读1000条存储提交,再读1000条存储提交,循环直到结束,慢慢存呗,如果时间不急。很少一次性提交的,谁都受不了。

非常感谢回复,你的意思是
读取文件是一个线程,读取1000条以后,扔到新开的线程里去插入DB,然后继续读取下一个1000条,以此循环,是吗?

#11


引用 10 楼 u010865104 的回复:
Quote: 引用 9 楼 popibbt 的回复:

遇到这种大数据量的存储,我一般做法都是,开个线程,然后分批次存储,例如读1000条存储提交,再读1000条存储提交,循环直到结束,慢慢存呗,如果时间不急。很少一次性提交的,谁都受不了。

非常感谢回复,你的意思是
读取文件是一个线程,读取1000条以后,扔到新开的线程里去插入DB,然后继续读取下一个1000条,以此循环,是吗?


差不多,看你程序结构,简单的一个线程即可。还有看你文件生成速度如何,如果不频繁,无所谓,如果频繁,就必须创建一个文件队列线程,读取生成的各个文件信息进入此队列,然后开始动态创建一个线程,处理队列中的文件,负责读取数据存储数据库(读1000条提交存储,sleep(5),再读取1000条……循环直到文件结束),都在这线程里完成;当前文件全部读取存储完毕后,从文件队列里再取下一个文件,创建线程读取文件内容,重复上面过程。

#12


各位兄弟,
我找到一个办法,好像可以进行处理了。
就是加上 @Transactional(propagation=Propagation.REQUIRES_NEW)。
好像可以让他插入以后立即commit。
现在在test阶段,好像可以。

如果可以的话,谁能解释一下为什么?
为什么不commit的时候,会不断使用内存呢?我明明用了flush和clear,应该会吧内存的东西清掉吧。
究竟是什么东西没有清除呢?

#13


其实这是一种比较安全的做法思想,具体批次1000条还是5000条,看你机器性能和对其他用户体验效果的测试,随意,反正一次条数越大速度越快,反之就整体时间会拉长。还有提交完一个批次,取下一批次,尽量SLEEP(5),给CPU时钟稍微稍微缓冲一下,要不量大可能会卡操作系统界面操作

#14


每1000条,session.flush()然后在session.clear()清除不就不会报java heap space

#15


这样的情况还不调用jdbc的接口更待何时...直接使用jdbc的批处理吧,无压力

#16


引用 14 楼 lwb553009450 的回复:
每1000条,session.flush()然后在session.clear()清除不就不会报java heap space

按理说应该这样就不会有问题了,可是你看到我代码里每50条就flush+clear了,应该不会有什么东西留在session里了。可是内存就是在不断增长。
反而,如果我让它每插入50条就commit一次的话,就不会有问题。
说明,虽然我flush+clear清楚了session,但是还有什么东西留在了内存里,究竟是什么东西啊?

#17


JDBC吧,再每十万条处理一次

#18


个人认为 你这个异常和hibernate效率没关系 你的事务是开在merge上的 每次调用merge 都会开启事物 HibernateTransactionManager.doBegin()的时候会将session绑定到线程 错误上来看是无法打开连接,事务应该放在service级,谁证明hibernate 不能处理百万数据了 

#19


哈哈,看完我就觉得我必须要用jdbc去搞一把!!!

#1


这个是出错信息。

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:599)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(AbstractPlatformTransactionManager.java:424)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:353)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy105.merge(Unknown Source)
at au.com.toyota.taipan.domain.services.impl.OrderEtdServiceImpl.importFromFile(OrderEtdServiceImpl.java:68)
at au.com.toyota.taipan.domain.services.impl.OrderEtdServiceImplTest.should_persist_the_order_etds_from_the_source_file_db1(OrderEtdServiceImplTest.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558)
... 34 more
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
localhost:1521:xe

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:280)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:319)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:344)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:148)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:545)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:174)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:165)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
... 39 more

#2


merge是干啥的?

你不能用save吗?

#3


建议还是用jdbc吧。要不你就换个64位至少8G内存的系统。

#4


该回复于2013-05-28 13:39:27被管理员删除

#5


Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
貌似tns有点问题,连不上。可能是因为前面操作时候没有关掉连接的问题,引起溢出。你看看getHibernateTemplate()的session应该有close的方法。你试着修改一下。
hibernate其实效率很不好,你真想高效的话,还是用jdbc比较好!

#6


引用 2 楼 rainbowsix 的回复:
merge是干啥的?

你不能用save吗?


试过save了,结果也一样,就save这一句会让内存增加。

#7


引用 4 楼 feier00 的回复:
打标记打标记打标记

怎么打标记啊?

#8


引用 5 楼 xianwangkai 的回复:
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
貌似tns有点问题,连不上。可能是因为前面操作时候没有关掉连接的问题,引起溢出。你看看getHibernateTemplate()的session应该有close的方法。你试着修改一下。
hibernate其实效率很不好,你真想高效的话,还是用jdbc比较好!


我另外一个表14000多条数据,用相同的处理就插进去了。和tns连接会有关系吗?
另外,这个循环用的应该是同一个session吧?close session的话,在什么时候关呢?

public final HibernateTemplate getHibernateTemplate() {
  return this.hibernateTemplate;
}

public Object merge(final Object entity) throws DataAccessException {
return executeWithNativeSession(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
checkWriteOperationAllowed(session);
return session.merge(entity);
}
});
}

#9


遇到这种大数据量的存储,我一般做法都是,开个线程,然后分批次存储,例如读1000条存储提交,再读1000条存储提交,循环直到结束,慢慢存呗,如果时间不急。很少一次性提交的,谁都受不了。

#10


引用 9 楼 popibbt 的回复:
遇到这种大数据量的存储,我一般做法都是,开个线程,然后分批次存储,例如读1000条存储提交,再读1000条存储提交,循环直到结束,慢慢存呗,如果时间不急。很少一次性提交的,谁都受不了。

非常感谢回复,你的意思是
读取文件是一个线程,读取1000条以后,扔到新开的线程里去插入DB,然后继续读取下一个1000条,以此循环,是吗?

#11


引用 10 楼 u010865104 的回复:
Quote: 引用 9 楼 popibbt 的回复:

遇到这种大数据量的存储,我一般做法都是,开个线程,然后分批次存储,例如读1000条存储提交,再读1000条存储提交,循环直到结束,慢慢存呗,如果时间不急。很少一次性提交的,谁都受不了。

非常感谢回复,你的意思是
读取文件是一个线程,读取1000条以后,扔到新开的线程里去插入DB,然后继续读取下一个1000条,以此循环,是吗?


差不多,看你程序结构,简单的一个线程即可。还有看你文件生成速度如何,如果不频繁,无所谓,如果频繁,就必须创建一个文件队列线程,读取生成的各个文件信息进入此队列,然后开始动态创建一个线程,处理队列中的文件,负责读取数据存储数据库(读1000条提交存储,sleep(5),再读取1000条……循环直到文件结束),都在这线程里完成;当前文件全部读取存储完毕后,从文件队列里再取下一个文件,创建线程读取文件内容,重复上面过程。

#12


各位兄弟,
我找到一个办法,好像可以进行处理了。
就是加上 @Transactional(propagation=Propagation.REQUIRES_NEW)。
好像可以让他插入以后立即commit。
现在在test阶段,好像可以。

如果可以的话,谁能解释一下为什么?
为什么不commit的时候,会不断使用内存呢?我明明用了flush和clear,应该会吧内存的东西清掉吧。
究竟是什么东西没有清除呢?

#13


其实这是一种比较安全的做法思想,具体批次1000条还是5000条,看你机器性能和对其他用户体验效果的测试,随意,反正一次条数越大速度越快,反之就整体时间会拉长。还有提交完一个批次,取下一批次,尽量SLEEP(5),给CPU时钟稍微稍微缓冲一下,要不量大可能会卡操作系统界面操作

#14


每1000条,session.flush()然后在session.clear()清除不就不会报java heap space

#15


这样的情况还不调用jdbc的接口更待何时...直接使用jdbc的批处理吧,无压力

#16


引用 14 楼 lwb553009450 的回复:
每1000条,session.flush()然后在session.clear()清除不就不会报java heap space

按理说应该这样就不会有问题了,可是你看到我代码里每50条就flush+clear了,应该不会有什么东西留在session里了。可是内存就是在不断增长。
反而,如果我让它每插入50条就commit一次的话,就不会有问题。
说明,虽然我flush+clear清楚了session,但是还有什么东西留在了内存里,究竟是什么东西啊?

#17


JDBC吧,再每十万条处理一次

#18


个人认为 你这个异常和hibernate效率没关系 你的事务是开在merge上的 每次调用merge 都会开启事物 HibernateTransactionManager.doBegin()的时候会将session绑定到线程 错误上来看是无法打开连接,事务应该放在service级,谁证明hibernate 不能处理百万数据了 

#19


哈哈,看完我就觉得我必须要用jdbc去搞一把!!!

#20