com.datastax.driver.core.PreparedStatement实例应该是应用程序中的单例吗?
如果是这样,如果连接丢失会发生什么?PreparedStatement是否无效并且必须采取手动操作来"重新制定"?
PreparedStatement用法的一个简单例子(除了准备+在同一方法中执行)将是辉煌的!
prepared-statement cassandra datastax-enterprise datastax-java-driver
如果使用纯文本CQL,DataStax Java Driver是否容易受到CQL注入攻击?会使用QueryBuilder帮助吗?
我只是将这个作为解决方案发布给那些在Glassfish 4上通过Maven部署使用Datastax的Java驱动程序时遇到错误的人.
正如在Datastax的网站上写的那样,驱动程序的依赖性是:
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>1.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果你通过Maven将它部署到Glassfish 4,它会抛出org.glassfish.deployment.common.DeploymentException:CDI部署失败......就像下面这样:
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)]
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at …Run Code Online (Sandbox Code Playgroud) cassandra maven datastax-enterprise glassfish-4 datastax-java-driver
com.datastax.driver.core.Session该类的文档说明了这一点
(...)每个会话维护与群集节点的多个连接(...)
但是,对EE环境的一般建议是将池和线程管理留给容器.
在我看来,DataStax驱动程序(主要不是针对EE环境)违反了这一规则.这让我担心驱动程序是否可以在我的EE应用程序中安全使用.
我正在评估卡桑德拉.我正在使用datastax驱动程序和CQL.
我想存储一些具有以下内部结构的数据,其中每个更新的名称都不同.
+-------+-------+-------+-------+-------+-------+
| | name1 | name2 | name3 | ... | nameN |
| time +-------+-------+-------+-------+-------+
| | val1 | val2 | val3 | ... | valN |
+-------+-------+-------+-------|-------+-------+
Run Code Online (Sandbox Code Playgroud)
所以时间应该是列键,name应该是行键.我用来创建这个表的CQL语句是:
CREATE TABLE IF NOT EXISTS test.wide (
time varchar,
name varchar,
value varchar,
PRIMARY KEY (time,name))
WITH COMPACT STORAGE
Run Code Online (Sandbox Code Playgroud)
我希望架构以这种方式易于查询.我还必须偶尔存储超过65000行的更新.因此,使用cassandra list/set/map数据类型不是一种选择.
我必须能够每秒处理至少1000个宽行插入,具有变化但大(~1000)个名称/值对的数量.
问题如下:我编写了一个简单的基准测试,可以执行1000个宽行插入,每个插入10000个名称/值对.我使用CQL和datastax驱动程序的性能非常慢,而不使用CQL的版本(使用astyanax)在同一测试集群上具有良好的性能.
我已经阅读了这个相关的问题,并且在这个问题的接受答案中表明你应该能够通过使用批量准备语句以原子方式快速创建一个新的宽行,这些语句可以在cassandra 2中找到.
所以我尝试使用它们,但我的性能仍然很慢(对于在localhost上运行的小型三节点集群,每秒两次插入).我错过了一些明显的东西,还是我必须使用较低级别的thrift API?我已经在astyanax中使用ColumnListMutation实现了相同的插入,我每秒大约有30个插入.
如果我必须使用较低级别的thrift API:
它是否实际上已被弃用,或者它使用起来不方便,因为它的级别较低?
我能用CQL查询用thrift api创建的表吗?
下面是scala中的一个独立代码示例.它只是创建一个批处理语句,用于插入具有10000列的宽行并重复插入性能.
我玩了BatchStatement的选项和一致性级别,但没有什么能让我获得更好的性能.
我唯一的解释是,尽管批处理由预准备语句组成,但条目将逐个添加到行中.
package cassandra
import com.datastax.driver.core._ …Run Code Online (Sandbox Code Playgroud) 我必须每个客户每秒存储大约250个数值,每小时大约900k个数字.它可能不会是一整天的录音(可能每天5-10个小时),但我会根据客户端ID和读取日期对数据进行分区.最大行长约为22-23M,仍然可以控制.毫无意义,我的计划看起来像这样:
CREATE TABLE measurement (
clientid text,
date text,
event_time timestamp,
value int,
PRIMARY KEY ((clientid,date), event_time)
);
Run Code Online (Sandbox Code Playgroud)
密钥空间的复制因子为2,仅用于测试,snitch是GossipingPropertyFileSnitch和NetworkTopologyStrategy.我知道复制因子3是更多的生产标准.
接下来,我在公司服务器上创建了一个小型集群,三个裸机虚拟化机器,具有2个CPU x 2核心和16GB RAM以及大量空间.我和他们在千兆局域网中.群集基于nodetool运行.
这是我用来测试我的设置的代码:
Cluster cluster = Cluster.builder()
.addContactPoint("192.168.1.100")
.addContactPoint("192.168.1.102")
.build();
Session session = cluster.connect();
DateTime time = DateTime.now();
BlockingQueue<BatchStatement> queryQueue = new ArrayBlockingQueue(50, true);
try {
ExecutorService pool = Executors.newFixedThreadPool(15); //changed the pool size also to throttle inserts
String insertQuery = "insert into keyspace.measurement (clientid,date,event_time,value) values (?, ?, ?, ?)";
PreparedStatement preparedStatement = session.prepare(insertQuery);
BatchStatement …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Java的最新Datastax Cassandra驱动程序运行以下CQL语句:
SELECT * FROM tablename WHERE column_one=1 AND column_2=9 AND column_3=50;
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止(只有2个AND),但我找不到链接超过2的方法,其中子句使用和():
Statement select = QueryBuilder.select().all().from( "tablename").where(QueryBuilder.eq("column_one", 1)).and(QueryBuilder.eq("column_two", 9));
Run Code Online (Sandbox Code Playgroud)
谢谢!
我们有10个Cassandra节点在运行Cassandra-2.1.8.我们最近升级到2.1.8版本.以前我们只使用3个运行Cassandra-2.1.2的节点.首先,我们将最初的3个节点从2.1.2升级到2.1.8(遵循升级Cassandra中描述的过程).然后我们在集群中添加了7个运行Cassandra-2.1.8的节点.然后我们启动了客户端程序.前几个小时一切正常,但几个小时后,我们在客户端程序日志中看到了一些错误
Thread-0 [29/07/15 17:41:23.356] ERROR com.cleartrail.entityprofiling.engine.InterpretationWriter - Error:com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: [/172.50.33.161:9041, /172.50.33.162:9041, /172.50.33.95:9041, /172.50.33.96:9041, /172.50.33.165:9041, /172.50.33.166:9041, /172.50.33.163:9041, /172.50.33.164:9041, /172.50.33.42:9041, /172.50.33.167:9041] - use getErrors() for details)
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:65)
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:259)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:175)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
at com.cleartrail.entityprofiling.engine.InterpretationWriter.WriteInterpretation(InterpretationWriter.java:430)
at com.cleartrail.entityprofiling.engine.Profiler.buildProfile(Profiler.java:1042)
at com.cleartrail.messageconsumer.consumer.KafkaConsumer.run(KafkaConsumer.java:336)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: [/172.50.33.161:9041, /172.50.33.162:9041, /172.50.33.95:9041, /172.50.33.96:9041, /172.50.33.165:9041, /172.50.33.166:9041, /172.50.33.163:9041, /172.50.33.164:9041, /172.50.33.42:9041, /172.50.33.167:9041] - use getErrors() for details)
at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:102)
at com.datastax.driver.core.RequestHandler$1.run(RequestHandler.java:176)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at …Run Code Online (Sandbox Code Playgroud) 当前用户访问同一行时,Cassandra行级锁定支持
考虑到Cassandra作为库存数据库,我们处于推车应用的设计阶段.现在的要求是,如果多个用户同时访问Inventory DB中的相同产品行.例如: - 产品表:productID productQuantitiy 1000 1如果第一个用户选择产品"1000"并在购物车中添加产品数量为"1",访问同一产品的其他用户在获得免费之前不应该选择此产品第一个用户(更新的产品数量为0).cassandra也为这种场景提供了行级锁定支持
我(理想情况下)喜欢使用纯JSON更新Cassandra中的一行(例如,类似于" INSERT INTO <table_name> JSON '<json_object_string>';"CQL语句).但是,通过CQL UPDATE语句似乎不存在此类功能.
我考虑的一种(脑死亡)方法是删除然后重新插入相关行.然而,这种方法肯定有其缺点 - 因此,从我的考虑集中消除它.
我使用" UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';"CQL语句实现了一个版本.但是,如果有类似" UPDATE <table_name> JSON '<new_json_object_string>';"的东西,我真的很想知道这一点.