Datastax cassandra似乎在缓存preparestatent

Datastax cassandra似乎在缓存preparestatent,cassandra,datastax-java-driver,Cassandra,Datastax Java Driver,当我的应用程序运行很长时间时,一切都正常工作。但当我将type a列从int更改为textDrop table并重新创建时,我发现了一个异常: com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [INT <-> java.lang.String] at com.datastax.oss.driver.inter

当我的应用程序运行很长时间时,一切都正常工作。但当我将type a列从int更改为textDrop table并重新创建时,我发现了一个异常:

com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [INT <-> java.lang.String]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:609)
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:95)
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:92)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957)
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963)
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:117)
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:215)
    at com.datastax.oss.driver.api.core.data.SettableByIndex.set(SettableByIndex.java:132)
    at com.datastax.oss.driver.api.core.data.SettableByIndex.setString(SettableByIndex.java:338)

是的,Java驱动程序4.x缓存准备好的语句——这与驱动程序3.x有所不同。发件人:

会话有一个内置缓存,可以准备相同的字符串两次

请注意,缓存的基础是:查询字符串与您提供的完全相同:驱动程序不执行任何类型的修剪或清理


我不能百分之百地确定源代码,但是缓存中的相关条目可能不会在表中清除。我建议打开,尽管这样的类型更改通常不被真正推荐-最好使用新类型引入新字段,即使可以重新创建表。

是的,Java驱动程序4.x缓存准备好的语句-它与驱动程序3.x有所不同。发件人:

会话有一个内置缓存,可以准备相同的字符串两次

请注意,缓存的基础是:查询字符串与您提供的完全相同:驱动程序不执行任何类型的修剪或清理


我不能百分之百地确定源代码,但是缓存中的相关条目可能不会在表中清除。我建议打开,尽管这样的类型更改通常不被真正推荐-最好使用新类型引入新字段,即使可以重新创建表。

这是正确的。准备好的语句是缓存的——如果重用准备好的语句,那么它的优化会使它们更加高效,因为它们只需要在查询不需要再次解析时准备好

但我怀疑您的问题在于您的查询涉及SELECT*。无论您使用的是哪种数据库,最佳实践建议都是显式枚举从表中检索的列


在准备好的语句中,每个列都绑定到一个数据类型。当您通过添加/删除列来更改模式时,列的顺序及其数据类型不再与结果集的数据类型匹配,因此您最终会遇到这样的情况:驱动程序在需要文本时获得int,反之亦然。干杯

没错。准备好的语句是缓存的——如果重用准备好的语句,那么它的优化会使它们更加高效,因为它们只需要在查询不需要再次解析时准备好

但我怀疑您的问题在于您的查询涉及SELECT*。无论您使用的是哪种数据库,最佳实践建议都是显式枚举从表中检索的列

在准备好的语句中,每个列都绑定到一个数据类型。当您通过添加/删除列来更改模式时,列的顺序及其数据类型不再与结果集的数据类型匹配,因此您最终会遇到这样的情况:驱动程序在需要文本时获得int,反之亦然。干杯

  basic.request {
    timeout = 5 seconds
    consistency = LOCAL_ONE
  }
  advanced.connection {
    max-requests-per-connection = 1024
    pool {
      local.size = 1
      remote.size = 1
    }
  }
  advanced.reconnect-on-init = true
  advanced.reconnection-policy {
    class = ExponentialReconnectionPolicy
    base-delay = 1 second
    max-delay = 60 seconds
  }
  advanced.retry-policy {
    class = DefaultRetryPolicy
  }
  advanced.protocol {
    version = V4
  }
  advanced.heartbeat {
   interval = 30 seconds
   timeout = 1 second
  }
  advanced.session-leak.threshold = 8
  advanced.metadata.token-map.enabled = false
}