故事是这样的:
我需要用一张新表(B)替换掉正在使用的表(A),A表和B表具有相同的结构,相同的索引字段,相同的约束,相同的主外键等。唯一的不同只是索引名和约束名。A表的数据量有5000w, B表的数据量有1000w。问题是当我们用B表替换掉A表后,会出现请求超时或者‘can not open connection’的异常,而去这类异常是偶发的,有些请求能够正常得到结果,有些请求会出现异常。
异常信息如下:
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
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.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1616)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2449)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)
at org.hibernate.loader.Loader.list(Loader.java:2187)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
烦请高手帮忙分析可能是什么原因造成这种次问题? 多谢。

解决方案 »

  1.   

    除了网络不稳定,应该也没啥可能了,要不就是近期有修改jar包文件,新的jar对cxf的支持不好。
      

  2.   


    rollback到A表后问题立即解决,网络问题的可能性比较小。
      

  3.   

    连接超时?  那也可能是数据太多,undo不够用,或者temp表空间不够用报错?
      

  4.   

    有几点疑问:
    1. rollback 到 A 是什么意思?
    2. 是不是代码中有使用了约束和索引的地方,并且还没有替换为 B
      

  5.   

    到 java 区问问吧。
      

  6.   


    --------
    1. rollback 到A表是说我们切换到新表B发现有这个问题的时候,就又改了表的名字,继续使用之前的A表。问题就解决了。A表是student,B表是student_new。我做的操作是先rename student 到student_old, 然后rename student_new为student。这个时候发现有问题,然后再rename回去继续用原来的student表。
    2.约束和索引都创建了,而去与原表的一致,只是名字不同,否则会有重名的冲突。
      

  7.   

    主要是java代码任何东西都没动过,唯一改变的就是DB这里。而去在另外的server 测试都是没有问题的。