2016-08-25 44 views
0

我正在運行Java datastax驅動程序以執行cql查詢以在一個查詢中一起創建模式和表。接收EOF異常如下。缺少EOF會話使用datastax驅動程序執行cql查詢

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) 

回答

1

您需要將兩個語句分成不同的通話session.execute

本地協議的設計方式是,每個請求執行對應一條語句。有批處理執行請求可以包含多個語句,但我不確定它對模式DDL有很大意義。驅動程序實際上在每次模式更改後都會進行一些架構協議輪詢,以確保在請求完成後,任何主機上的新元素的引用都能成功。

+0

有沒有解決方法?在一次調用中執行所有語句? –

+0

我擴大了我的答案。關於連續執行兩個DDL語句的問題是什麼? –

+0

我在一個文件的備份階段將所有密鑰空間的模式轉儲到一個文件中,所以我想要一種方法來執行文件中的所有DDL語句(創建密鑰空間和列族)以在一個查詢中執行,而不是解析文件中的每個語句並執行連續。 –

相關問題