【问题描述】
Java 驱动报错 SDB_UNKNOWN_MESSAGE
【问题回复】
造成该问题的原因可能如下:
1. 用户没有正确使用sequoiadb的连接对象。
目前(v3.0),sequoiadb 驱动不是线程安全的。由同一个连接对象(SequoiaDB类对象)产生的所有对象(如:collection, collection space, cursor等对象)都共用同一个socket。由于java/C#驱动在使用该socket对象时,并没有加锁保护,在这种情况下,如果用将这些共用同一socket的对象放到不同的线程上去使用时,将会导致不同线程之间相互收错消息的可能。所以,若发生消息收串的情况,用户将收到来自驱动层的报错。
2. 用户使用的Java驱动包有bug。
若java驱动包为v2.8.4及之前的版本,当用户在使用java驱动连接池过程调用了com.sequoiadb.net.ConfigOptions#setSocketTimeout() 设置了socket收发超时时间,将有可能触发一个已知的 bug。
由于连接池的所有连接都是长连接,当在连接池中设置了收发消息超时时间后,假设某一次用户从连接池拿了一个连接去做一个超时为5秒的查询,而刚好这个查询需要大概6秒的时间。在这种情况下,连接在5秒钟后被用户放回连接池,而在池中,连接在下一秒钟收到上一次查询的应答。若在这时,该连接又被用户从池中拿出去做插入的操作,由于socket为全双工通道,收发缓冲区都相互对立,所以,在socket发完插入的消息后,驱动那是就能从socket的接收缓存区读取引擎返回的内容。在这种情况下,驱动读取到的为上一次查询的结果,这也就造成了收发消息不一致的情况。
在这种情况下,用户可以考虑将驱动版本升级到 v2.8.5 及以后,或是不设置socket收发超时时间。