MyCATApache / Mycat-Server

GNU General Public License v2.0
9.47k stars 3.85k forks source link

mycat用hibernate更新时报空指针异常(分表,带版本号的乐观锁机制),改成sql语句是可以执行的问题 #1946

Open 437865981 opened 5 years ago

zwyqz commented 5 years ago

日志 ,语句 有吗?

437865981 commented 5 years ago

1、hibernate日志(空指针异常,确定代码、值没问题,因为改成相应的sql是可以执行的):Hibernate: / update top.hb.model.UserAmount / update t_user_amount set amount=?, version=? where id=? and version=?

[2018-08-07 14:32:17,705] [http-bio-8081-exec-43] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - java.lang.NullPointerException [2018-08-07 14:32:17,756] [http-bio-8081-exec-43] ERROR org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler - Exception occurred during processing request: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQ L state [HY000]; error code [3009]; could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement org.springframework.orm.hibernate4.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQL state [HY000]; error code [3009]; could not execute statement; nested exception is org.hibernate.excepti on.GenericJDBCException: could not execute statementat at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernbernateAccessException(on(SessionFactoryUtils.java:170) ) at at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(Hib(te(HibernateTemplate.java:344) ) at at org.springframework.orm.hibernate4.HibernateTemplate.executeWithNathNativeSession(on(HibernateTemplate.java:309) ) at at org.springframework.orm.hibernate4.HibernateTemplate.findByCriteriteria(ia(HibernateTemplate.java:1006) ) at at org.springframework.orm.hibernate4.HibernateTemplate.findByCriteriteria(ia(HibernateTemplate.java:998) ) at at com.yun.common.baseclass.AbstractBaseDAO.findByDetacheachedCriteria(ia(AbstractBaseDAO.java:131) ) at at com.yun.admin.btct.service.impl.BtctServiceImpl.getUserAmountount(nt(BtctServiceImpl.java:2779) ) at at com.yun.admin.btct.service.impl.BtctServiceImpl.updateAmountDuntDetail(il(BtctServiceImpl.java:2750) ) at at com.yun.admin.btct.service.impl.BtctServiceImpl.cancelWithdrahdraw(aw(BtctServiceImpl.java:2662) ) at at sun.reflect.NativeMethodAccessorImpl.invoke0(Na0(Native Method) at at sun.reflect.NativeMethodAccessorImpl.invoke(Nat(ke(NativeMethodAccessorImpl.java:62) ) at at sun.reflect.DelegatingMethodAccessorImpl.invoke(Del(ke(DelegatingMethodAccessorImpl.java:43) ) at at java.lang.reflect.Method.invoke(Met(ke(Method.java:498) ) at at org.springframework.aop.support.AopUtils.invokeJoinpoinpointUsingReflection(on(AopUtils.java:333) ) at at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoinpoint(nt(ReflectiveMethodInvocation.java:190) ) at at org.springframework.aop.framework.ReflectiveMethodInvocation.proceedceed(ed(ReflectiveMethodInvocation.java:157) ) at at org.springframework.transaction.interceptor.TransactionInonInterceptor$or$1.proceedceedWithInvocation(on(TransactionInterceptor.java:99) ) at at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinThinTransaction(on(TransactionAspectSupport.java:282) ) at at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(Tra(ke(TransactionInterceptor.java:96) ) at at org.springframework.aop.f.f

2:mycat DEBUG日志(报NullPointerExerException,hibernate报的空指针可能是这里返回的): java.lang.NullPointerExerException at at java.lang.String.comparepareTo(To(String.java:1155) ~[) ~[?:1.8.0_144] at at io.mycat.route.RouteResultsetNode.comparepareTo(To(RouteResultsetNode.java:287) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.route.RouteResultsetNode.comparepareTo(To(RouteResultsetNode.java:36) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at java.util.concurrent.ConcurrentHashMap.comparepareComparables(es(ConcurrentHashMap.java:732) ~[) ~[?:1.8.0_144] at at java.util.concurrent.ConcurrentHastHashMap$TreeBin.(t>(ConcurrentHashMap.java:2773) ~[) ~[?:1.8.0_144] at at java.util.concurrent.ConcurrentHashMap.treeifyBin(Con(in(ConcurrentHashMap.java:2630) ~[) ~[?:1.8.0_144] at at java.util.concurrent.ConcurrentHashMap.putVal(Con(al(ConcurrentHashMap.java:1063) ~[) ~[?:1.8.0_144] at at java.util.concurrent.ConcurrentHashMap.put(Con(ut(ConcurrentHashMap.java:1006) ~[) ~[?:1.8.0_144] at at io.mycat.server.NonBlockingSession.bindConnectioction(on(NonBlockingSession.java:439) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.connectionAcqnAcquired(ed(MultiNodeQueryHandler.java:234) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.backend.datasource.PhysicalDatasource.takeCon(Phy(on(PhysicalDatasource.java:466) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.backend.datasource.PhysicalDatasource.getConnectiontion(on(PhysicalDatasource.java:503) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.backend.datasource.PhysicalDBNode.getConnectiontion(on(PhysicalDBNode.java:134) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.execute(Mul(te(MultiNodeQueryHandler.java:207) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.server.NonBlockingSession.checkDistriTrriTransaxAndExecute(te(NonBlockingSession.java:200) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.server.NonBlockingSession.execute(Non(te(NonBlockingSession.java:163) ~[) ~[ ~[Mycat-server-1.6.5-release.jar:?] :?] at at io.mycat.server.ServerConnection.routeEndExecuxecuteSQL(QL(ServerConnection.java:292) ~[) ~[Mycat-ser

注:1、用的单库分表,分表确实成功,插入和查询都是没问题的

zwyqz commented 5 years ago

schema配置确定没问题吗?
image

437865981 commented 5 years ago

没问题的,插入、查询都可以 ,explain查看了,确实是按规则分的表。所有的文件和代码都是测试环境跑通的,完全一致。 1,现在是测试环境完全OK,只有生产环境才有这个问题。用了阿里云服务器。服务器的环境和这个有关系吗,或者事务相关的配置? 2、测试mycat 5.5.56-MariaDB。生产环境:5.6.16

zwyqz commented 5 years ago

看下有木有在schema里面有木有两个表名一样的吧啊.

437865981 commented 5 years ago

没有,,现在就是发现一个规律:首先查询出数据,然后更新数据,再查询一次的时候就会报错=.=

zwyqz commented 5 years ago

两个结局办法 : 1看下jdk版本, 2. 在报错的地方加个判断