【问题标题】:Datastax cassandra QueryBuilder insertion error (java)Datastax cassandra QueryBuilder 插入错误(java)
【发布时间】:2015-01-25 23:09:44
【问题描述】:

环境:

  • java 7

  • cassandra 2.1.2 在我的本地开发工作站上运行在 Windows 8.1 上的一个简单节点中

  • 驱动程序 cassandra-driver-core-2.1.2

  • 运行环境:apache karaf 2.3.8

我尝试通过在由简单类型(x 和 y 坐标)定义的列中提供 json 来插入一行。

我构建了这个 java 语句:

Statement statement = QueryBuilder
.insertInto("myKeySpace", "myTable")
.value("myKeyColumn", "myKeyValue")
.value("coordinates", "{\"x\":10.4,\"y\":20.3}");

当执行此操作时:

mySession.execute(statement);

我遇到以下错误(完整的堆栈跟踪在此消息的末尾):

com.datastax.driver.core.exceptions.InvalidQueryException: Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]

[在下面的CQL语句中,我对列名进行了匿名化处理,可能是引号错误,但问题出在上面的java语句中]

我的 cassandra 表和类型:

CREATE TABLE IF NOT EXISTS "myTable" ( 
    "myKeyColumn" text,
    coordinates FROZEN<coordinates>,
    PRIMARY KEY ("myKeyColumn") 
);

CREATE TYPE IF NOT EXISTS coordinates (
      x double,
      y double
);

在 Datastax DevCenter 中执行以下查询时,效果很好:

INSERT INTO "myTable"("myKeyColumn","coordinates")
VALUES ('myKeyValue',{"x":10.4,"y":20.3});

欢迎任何帮助! :-)

完整的堆栈跟踪:

2014-11-27 11:38:07,532 | WARN  | tp1271566160-230 | ServletHandler                   | pse.jetty.servlet.ServletHandler  563 | 135 - org.eclipse.jetty.aggregate.jetty-all-server - 8.1.15.v20140411 | /cxf/rest/myProject/add
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: com.datastax.driver.core.exceptions.InvalidQueryException: Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:336)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:241)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)[83:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0]
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)[171:org.apache.cxf.cxf-rt-transports-http:2.7.12]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:69)[145:org.ops4j.pax.web.pax-web-jetty:3.1.1]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:240)[145:org.ops4j.pax.web.pax-web-jetty:3.1.1]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:77)[145:org.ops4j.pax.web.pax-web-jetty:3.1.1]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.Server.handle(Server.java:370)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[135:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at java.lang.Thread.run(Thread.java:724)[:1.7.0_25]
Caused by: org.apache.cxf.interceptor.Fault: com.datastax.driver.core.exceptions.InvalidQueryException: Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]
    at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:170)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:136)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:204)[177:org.apache.cxf.cxf-rt-frontend-jaxrs:2.7.12]
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)[177:org.apache.cxf.cxf-rt-frontend-jaxrs:2.7.12]
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)[164:org.apache.cxf.cxf-api:2.7.12]
    ... 36 more
Caused by: org.mycompany.service.container.InvocationException: com.datastax.driver.core.exceptions.InvalidQueryException: Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]
    at org.mycompany.service.container.interceptors.ServiceInterceptor.invoke(ServiceInterceptor.java:73)
    at org.mycompany.service.container.InvocationChain.invokeNext(InvocationChain.java:82)
    at org.mycompany.service.container.interceptors.SecurityInterceptor.invoke(SecurityInterceptor.java:84)
    at org.mycompany.service.container.InvocationChain.invokeNext(InvocationChain.java:82)
    at org.mycompany.service.container.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:66)
    at com.sun.proxy.$Proxy24.add(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_25]
    at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_25]
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:188)[164:org.apache.cxf.cxf-api:2.7.12]
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:104)[164:org.apache.cxf.cxf-api:2.7.12]
    ... 41 more
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]
    at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
    at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:258)
    at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:174)
    at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
    at mypackage.data.internal.mydao.add(Mydao.java:140)
    ... 51 more
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:97)[120:com.datastax.driver.core:2.1.0]
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:110)[120:com.datastax.driver.core:2.1.0]
    at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:235)[120:com.datastax.driver.core:2.1.0]
    at com.datastax.driver.core.RequestHandler.onSet(RequestHandler.java:367)[120:com.datastax.driver.core:2.1.0]
    at com.datastax.driver.core.Connection$Dispatcher.messageReceived(Connection.java:584)[120:com.datastax.driver.core:2.1.0]
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:70)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:70)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)[118:org.jboss.netty:3.9.3.Final]
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)[118:org.jboss.netty:3.9.3.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_25]
    ... 1 more

【问题讨论】:

    标签: java json cassandra cql datastax


    【解决方案1】:

    驱动程序 v2.1.2 中的 UDT 存在一个已知问题,将在 v2.1.3 中解决。同时,您可以尝试这里给出的解决方法:

    https://datastax-oss.atlassian.net/browse/JAVA-500

    如:

    Cluster.builder().withProtocolVersion(ProtocolVersion.V3)
    

    看看有没有帮助

    【讨论】:

    • 感谢 mikea 的回答。所以我在 V3 中使用了 ProtocolVersion。这没有帮助。然后我意识到3天前出了一个2.1.3版本。我仍然有错误消息。然后,我在2.1.3上使用了V3 ProtocolVersion,还是一样的错误。
    【解决方案2】:

    我从 github 下载了 cassandra-driver-parent 并查看了 core 的测试。 我找到了一种不同的方式来调用这些类型:

    UDTValue udtValue = keyspaceBuilder.getCluster().getMetadata().getKeyspace("myKeyspace").getUserType("coordinates").newValue()
        .setDouble("x", x)
        .setDouble("y", y);
    

    然后,在 QueryBuilder 中,我追加:

    .value("coordinates", udtValue);
    

    这行得通。

    【讨论】:

    • 事实上,我必须将 UDTValue 而不是 json 作为 String 传递(与本机 CQL 中可能的情况不同)。但是代码变得更加繁琐。
    • 我刚试过: session.execute("insert into test.test(id, value) values ('2', {\"x\":10.0, \"y\":11.1} )");这行得通。
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2018-01-18
    • 2019-04-03
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多