Couchbase&x2B;xmemcached

Couchbase&x2B;xmemcached,couchbase,xmemcached,Couchbase,Xmemcached,我正在多线程JavaSE应用程序中使用couchbase和xmemcached客户端。我经常观察到couchbase无法保存最后几把钥匙,而传统的memcached可以很好地设置所有钥匙。在这两种情况下,我都使用完全相同的xmemcachedclient配置 弹簧配置 <bean name="memcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="sh

我正在多线程JavaSE应用程序中使用couchbase和xmemcached客户端。我经常观察到couchbase无法保存最后几把钥匙,而传统的memcached可以很好地设置所有钥匙。在这两种情况下,我都使用完全相同的xmemcachedclient配置

弹簧配置

<bean name="memcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown">
<property name="configuration">
  <bean class="com.google.code.yanf4j.config.Configuration">
     <property name="handleReadWriteConcurrently" value="true" />
  </bean>
</property>
<property name="servers">
  <value>127.0.0.1:11211</value>
</property>
<!-- server's weights -->
<property name="weights">
  <list>
     <value>2</value>
  </list>
</property>
<!-- nio connection pool size -->
<!-- <property name="connectionPoolSize" value="4"></property> -->
<!-- Use binary protocol,default is TextCommandFactory -->
<property name="commandFactory">
  <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory" />
</property>
<!-- Distributed strategy -->
<property name="sessionLocator">
  <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" />
</property>
<!-- Serializing transcoder -->
<property name="transcoder">
  <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</property>
<!-- ByteBuffer allocator -->
<property name="bufferAllocator">
  <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator" />
</property>
</bean>

127.0.0.1:11211
2.
下面是我的测试代码,用于检查丢失的密钥

@Test
public void test100000HitMiss() 
{
    ArrayList<Integer> hits = new ArrayList<Integer>();
    ArrayList<Integer> misses = new ArrayList<Integer>();

    for(Integer i=0; i < 100000; i++)
    {
        try 
        {
            Object val = memcachedClient.get("2/C/TALAL" + i.toString());

            if(null == val)
                misses.add(i);
            else
                hits.add(i);
        } 
        catch (Exception ex) 
        {
            logger.error(ex);
        }
    }

    logger.info("Hits: " + hits.size() + " - Misses: " + misses.size());

}
@测试
公共无效测试10000hitmiss()
{
ArrayList hits=新建ArrayList();
ArrayList未命中=新建ArrayList();
对于(整数i=0;i<100000;i++)
{
尝试
{
Object val=memcachedClient.get(“2/C/TALAL”+i.toString());
if(null==val)
未命中。添加(i);
其他的
增加(i);
} 
捕获(例外情况除外)
{
记录器错误(ex);
}
}
logger.info(“Hits:+Hits.size()+”-Misses:+Misses.size());
}

每次运行此测试时,我都会在misses数组中得到3或4个键

您是否有编程问题,因为这似乎只是一个观察结果?您是否收到couchbase的错误?我假设您正在为每个线程使用不同的连接句柄,如果不是,您可能应该这样做。如果couchbase服务器出现资源(磁盘或更可能的内存)问题,我认为您会遇到其他问题的唯一原因是。@WiredPairie您可以从我的帖子中提取问题。。。有一个是给你的sure@DonDickinson在couchbase中设置数据时,我没有收到任何错误(或异常)。我看到的是,Couchbase在多线程设置中大多数情况下都无法保存最后3-4个键,而单线程可以完美地保存所有键。我还编写了一个测试代码来检查丢失的键,它总是按顺序给我最后几个键。我猜xmemcached自己处理连接,或者是否有允许每个线程唯一连接的设置?如何检查“缺少键”?(再说一次,您并没有具体的编程问题……它缺少很多细节)。