【问题标题】:missing EOF session execute cql query using datastax driver缺少 EOF 会话使用 datastax 驱动程序执行 cql 查询
【发布时间】:2017-01-02 05:41:06
【问题描述】:

我正在运行 Java datastax 驱动程序来执行 cql 查询以在一个查询中一起创建模式和表。并收到如下EOF异常。

session.execute("CREATE KEYSPACE testkeyspace WITH REPLICATION = { 'class' : 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor': '3' } AND DURABLE_WRITES = true;"+
            "CREATE TABLE testkeyspace.users (" +
            "    name text," +
            "    birth_year int," +
            "    gender text," +
            "    PRIMARY KEY (name)" +
            ") WITH read_repair_chance = 0.0" +
            "   AND dclocal_read_repair_chance = 0.1" +
            "   AND gc_grace_seconds = 864000" +
            "   AND bloom_filter_fp_chance = 0.01" +
            "   AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' }" +
            "   AND comment = ''" +
            "   AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' }" +
            "   AND compression = { 'sstable_compression' : 'org.apache.cassandra.io.compress.LZ4Compressor' }" +
            "   AND default_time_to_live = 0" +
            "   AND speculative_retry = '99.0PERCENTILE'" +
            "   AND min_index_interval = 128" +
            "   AND max_index_interval = 2048;");

异常跟踪

Exception in thread "main" com.datastax.driver.core.exceptions.SyntaxError: line 1:159 missing EOF at 'CREATE' (...} AND DURABLE_WRITES = true;[CREATE] TABLE...)
at com.datastax.driver.core.exceptions.SyntaxError.copy(SyntaxError.java:58)
at com.datastax.driver.core.exceptions.SyntaxError.copy(SyntaxError.java:24)
at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:63)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:39)
at com.example.helloworld.HelloWorld.main(HelloWorld.java:58)
Caused by: com.datastax.driver.core.exceptions.SyntaxError: line 1:159 missing EOF at 'CREATE' (...} AND DURABLE_WRITES = true;[CREATE] TABLE...)
at com.datastax.driver.core.Responses$Error.asException(Responses.java:132)
at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179)
at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:184)
at com.datastax.driver.core.RequestHandler.access$2500(RequestHandler.java:43)
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:798)
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:617)
at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:1005)
at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:928)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:276)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:263)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: cassandra datastax datastax-java-driver


    【解决方案1】:

    您需要将这两个语句分成对session.execute 的不同调用。

    原生协议的设计方式,每个请求执行对应一个语句。有可能包含多个语句的批处理执行请求,但我不确定它对模式 DDL 是否有意义。驱动程序实际上有一些模式协议轮询,在每次模式更改后发生,以确保在请求完成后对新元素的引用在任何主机上成功。

    【讨论】:

    • 有解决办法吗?一次调用执行所有语句?
    • 我扩展了我的答案。你对串行执行两个 DDL 语句有什么顾虑?
    • 我在备份阶段将所有键空间的模式转储到一个文件中,因此我想要一种方法来执行文件中的所有 DDL 语句(创建键空间和列族)以在一个查询中执行,而不是解析文件中的每个语句并串行执行。
    • cqlsh -f 可以从这样的文件中获取输入。 docs.datastax.com/en/cql/3.1/cql/cql_reference/cqlsh.html 它为您解析。如您所描述的,无法解析。
    • 是否有票可以添加端点以支持从文件执行或使用多个语句解析字符串查询以供将来发布?
    猜你喜欢
    • 2018-09-26
    • 2016-11-14
    • 2016-11-29
    • 2013-09-09
    • 1970-01-01
    • 2020-12-07
    • 2014-04-24
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多