解决方案 »

  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.   

    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比较好!
      

  5.   


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

  6.   


    我另外一个表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);
    }
    });
    }
      

  7.   

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

  8.   

    各位兄弟,
    我找到一个办法,好像可以进行处理了。
    就是加上 @Transactional(propagation=Propagation.REQUIRES_NEW)。
    好像可以让他插入以后立即commit。
    现在在test阶段,好像可以。如果可以的话,谁能解释一下为什么?
    为什么不commit的时候,会不断使用内存呢?我明明用了flush和clear,应该会吧内存的东西清掉吧。
    究竟是什么东西没有清除呢?
      

  9.   

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

  10.   

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

  11.   

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

  12.   

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

  13.   

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

  14.   

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