ngbatis icon indicating copy to clipboard operation
ngbatis copied to clipboard

MATCH will hang in certain cases

Open liushuyu1 opened this issue 1 year ago • 23 comments

查询语句: MATCH (n)-[r:transfer]->(n2) WHERE id(n) == $p0 AND id(n2) == $p1 RETURN r

本地执行没问题,到服务器上跑的时候,执行到一定查询次数就会卡住不动了,也没有日志提示

image

liushuyu1 avatar Aug 30 '23 08:08 liushuyu1

这个截图说的是上次执行之后,卡住的执行过程没有日志是吧

CorvusYe avatar Aug 30 '23 08:08 CorvusYe

是的是的

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

换这条语句也会卡住 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)

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

难道是这个箭头的原因吗

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

这些信息是有点难分析出是哪里出的问题,是数据上还是程序上 如果是 ngbatis 的问题,最大的可能是在会话的调度上,定期巡检失活的连接,然后重建新连接 但是这种情况我这边的表现是会报一次错,但卡住的情况我也是没有碰到过,期待更多的信息

CorvusYe avatar Aug 30 '23 09:08 CorvusYe

如果是语法上的差异可以明确重现会不会卡住,可以将两个脚本分别在studio/console中执行下看看

CorvusYe avatar Aug 30 '23 09:08 CorvusYe

我描述一下我的场景: 建立两个人的转账关系,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); }

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

然后那个卡顿的点是在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

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

然后我替换成NebulaDaoBasic.existsEdge好像就不会卡住 image

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

数据量很大吗,selectTransfer 跟 NebulaDaoBasic 的区别也是差一个箭头的问题 但你的业务避不开这个箭头啊,不然 to 向 from 转账的记录在 existsEdge 的判断下是 true from 并没有向 to 转过账,跟业务逻辑是不是相悖了

CorvusYe avatar Aug 30 '23 09:08 CorvusYe

是滴是滴,数据量不算大,现在我是要判断左边点向右边点是否有转账,但是existsEdge好像并不能判断单边的

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

我换成->的查询就卡住,不过不是第一次就卡住,而是过了一定次数就会卡住,然后换成-就不会卡住,刚刚又试了一下

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

是个很诡异的问题,SHOW LOCAL QUERIES; 能查到卡住的查询吗

CorvusYe avatar Aug 30 '23 09:08 CorvusYe

好像并不能 image

liushuyu1 avatar Aug 30 '23 09:08 liushuyu1

那 SHOW QUERIES; 呢

CorvusYe avatar Aug 30 '23 10:08 CorvusYe

no data image

liushuyu1 avatar Aug 30 '23 10:08 liushuyu1

目前我也没办法定位具体是哪个环节卡住了 按我的理解如果是在数据库卡住了,应该会有对应的QUERY记录才对 我在论坛提了个帖子 https://discuss.nebula-graph.com.cn/t/topic/13899 ,等待一下回复

CorvusYe avatar Aug 30 '23 10:08 CorvusYe

好的,谢谢。另外我这边又测试了一下,直接while循环调用,然后打印次数 image

然后发现本地跑是没问题,能一直跑下去,不卡住 image

但是我在服务器上跑就会卡住,而且次数很准,每次基本都是第260次的时候 image

我本地是MacOS,

服务器是Ubuntu image

liushuyu1 avatar Aug 30 '23 11:08 liushuyu1

这个用例可以试试线上跑测试库,或者本地连正式库?(不知道你们能不能允许这种操作)排除一下跟数据库数据状态的影响

CorvusYe avatar Aug 30 '23 11:08 CorvusYe

试了,还是一样的,so sad

liushuyu1 avatar Aug 30 '23 11:08 liushuyu1

那这就跟数据库没有关系,这样上面的show没有结果也就解释得通了,但这个箭头跟非箭头的区别反而解释不通了,只有数据库才会涉及语义,对于其他环节只是长度差1的字符串,so sad...

CorvusYe avatar Aug 30 '23 11:08 CorvusYe

目前我也没办法定位具体是哪个环节卡住了 按我的理解如果是在数据库卡住了,应该会有对应的QUERY记录才对 我在论坛提了个帖子 https://discuss.nebula-graph.com.cn/t/topic/13899 ,等待一下回复

这边有回复了,看样子 SHOW QUERIES 没结果可以说明没在数据库查询中卡住,这就不好排查了 可以试试本地用 java -jar 的方式启动看看,排除下启动方式带来的干扰 剩下的就是环境参数的问题了

CorvusYe avatar Aug 31 '23 07:08 CorvusYe

好吧,谢谢,我试试

liushuyu1 avatar Aug 31 '23 07:08 liushuyu1