ngbatis
ngbatis copied to clipboard
MATCH will hang in certain cases
查询语句: MATCH (n)-[r:transfer]->(n2) WHERE id(n) == $p0 AND id(n2) == $p1 RETURN r
本地执行没问题,到服务器上跑的时候,执行到一定查询次数就会卡住不动了,也没有日志提示
这个截图说的是上次执行之后,卡住的执行过程没有日志是吧
是的是的
换这条语句也会卡住 MATCH (n)-[r:transfer]->(n2) WHERE id(n) == $p0 AND id(n2) == $p1 RETURN count(*) > 0
但是换成这条好像就不会卡住 MATCH (n)-[r: ${ p1 }]-(n2) WHERE id(n) == $p0 AND id(n2) == $p2 RETURN count(*) > 0
区别就是(n)-[r:transfer]->(n2) 和 (n)-[r: ${ p1 }]-(n2)
难道是这个箭头的原因吗
这些信息是有点难分析出是哪里出的问题,是数据上还是程序上 如果是 ngbatis 的问题,最大的可能是在会话的调度上,定期巡检失活的连接,然后重建新连接 但是这种情况我这边的表现是会报一次错,但卡住的情况我也是没有碰到过,期待更多的信息
如果是语法上的差异可以明确重现会不会卡住,可以将两个脚本分别在studio/console中执行下看看
我描述一下我的场景: 建立两个人的转账关系,vertex是人,edge是转账关系。 //1.查询出两个人之间的转账关系是否存在 Transfer transfer = nebulaGraphManager.selectTransfer(from, to); //2.如果存在就插入,否则就更新转账关系的部分属性 if(transfer == null){ insertTransfer(tokenTransfer,fromWallet,toWallet,txTime); } else { updateTransfer(transfer,tokenTransfer,fromWallet,toWallet,txTime); }
然后那个卡顿的点是在1这里 Transfer transfer = nebulaGraphManager.selectTransfer(from, to); 对应的语句是 <select id="selectByStartAndEnd" resultType = "com.bitjg.eth.entity.nebula.Transfer"> MATCH (n)-[r:transfer]->(n2) WHERE id(n) == $p0 AND id(n2) == $p1 RETURN r
然后我替换成NebulaDaoBasic.existsEdge好像就不会卡住
数据量很大吗,selectTransfer 跟 NebulaDaoBasic 的区别也是差一个箭头的问题 但你的业务避不开这个箭头啊,不然 to 向 from 转账的记录在 existsEdge 的判断下是 true from 并没有向 to 转过账,跟业务逻辑是不是相悖了
是滴是滴,数据量不算大,现在我是要判断左边点向右边点是否有转账,但是existsEdge好像并不能判断单边的
我换成->的查询就卡住,不过不是第一次就卡住,而是过了一定次数就会卡住,然后换成-就不会卡住,刚刚又试了一下
是个很诡异的问题,SHOW LOCAL QUERIES; 能查到卡住的查询吗
好像并不能
那 SHOW QUERIES; 呢
no data
目前我也没办法定位具体是哪个环节卡住了 按我的理解如果是在数据库卡住了,应该会有对应的QUERY记录才对 我在论坛提了个帖子 https://discuss.nebula-graph.com.cn/t/topic/13899 ,等待一下回复
好的,谢谢。另外我这边又测试了一下,直接while循环调用,然后打印次数
然后发现本地跑是没问题,能一直跑下去,不卡住
但是我在服务器上跑就会卡住,而且次数很准,每次基本都是第260次的时候
我本地是MacOS,
服务器是Ubuntu
这个用例可以试试线上跑测试库,或者本地连正式库?(不知道你们能不能允许这种操作)排除一下跟数据库数据状态的影响
试了,还是一样的,so sad
那这就跟数据库没有关系,这样上面的show没有结果也就解释得通了,但这个箭头跟非箭头的区别反而解释不通了,只有数据库才会涉及语义,对于其他环节只是长度差1的字符串,so sad...
目前我也没办法定位具体是哪个环节卡住了 按我的理解如果是在数据库卡住了,应该会有对应的QUERY记录才对 我在论坛提了个帖子 https://discuss.nebula-graph.com.cn/t/topic/13899 ,等待一下回复
这边有回复了,看样子 SHOW QUERIES 没结果可以说明没在数据库查询中卡住,这就不好排查了 可以试试本地用 java -jar 的方式启动看看,排除下启动方式带来的干扰 剩下的就是环境参数的问题了
好吧,谢谢,我试试