我是Spring-data-cassandra的新手.我的示例代码如下所示:
Customer.java
@Table
public class Customer {
@PrimaryKey
private String id;
private String firstName;
private String lastName;
@CassandraType(type = Name.BIGINT)
private Long age;
protected Customer() {}
public Customer(String id, String firstName, String lastName, Long age) {
this.firstName = firstName;
this.lastName = lastName;
this.id = id;
this.age = age;
}
public String getId() {
return id;
}
public Long getAge() {
return age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public String …Run Code Online (Sandbox Code Playgroud) 嘿,我是Cassandra的新手,我对Spring jdbc-template很友好.
有谁可以解释他们两个之间的差异?你也可以建议哪一个好用吗?
谢谢.
我正在使用spring-data-cassandra(1.3.1.RELEASE)连接到cassandra数据库。有没有办法改变spring-data-cassandra中的一致性级别。默认情况下为1 级(spring-data-cassandra中的默认一致性级别是多少?)。但是如何改变呢?
谢谢!
我正在尝试保存java.util.UUID到Cassandra类型的列timeuuid.例如,这是一个默认的spring-data-cassandra映射:http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#mapping-conversion.UUID的值是由java.util.UUID#randomUUID()
我得到一个异常生成的:
"com.datastax.driver.core.exceptions.InvalidQueryException: Invalid version for TimeUUID type"
@Override
public void validate(byte[] bytes)
{
if (bytes.length != 16 && bytes.length != 0)
throw new MarshalException(String.format("TimeUUID should be 16 or 0 bytes (%d)", bytes.length));
// version is bits 4-7 of byte 6.
if (bytes.length > 0)
if ((bytes[6] & 0xf0) != 0x10)
throw new MarshalException("Invalid version for TimeUUID type.");
}
Run Code Online (Sandbox Code Playgroud) 我试图java.time.LocalDateTime在我的 Cassandra 数据库中保留一个对象并使其与时区无关。我正在使用 Spring Data Cassandra 来做到这一点。
问题是,沿着这条线的某个地方,有些东西将这些LocalDateTime对象视为在我的服务器的时区中,并在将它们存储在数据库中时将它们偏移到 UTC 时间。
这是错误还是功能?我可以以某种方式解决它吗?
配置:
@Configuration
@EnableCassandraRepositories(
basePackages = "my.base.package")
public class CassandraConfig extends AbstractCassandraConfiguration{
@Override
protected String getKeyspaceName() {
return "keyspacename";
}
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster =
new CassandraClusterFactoryBean();
cluster.setContactPoints("127.0.0.1");
cluster.setPort(9142);
return cluster;
}
@Bean
public CassandraMappingContext cassandraMapping()
throws ClassNotFoundException {
return new BasicCassandraMappingContext();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望保留的预订记录:
@Table("booking")
public class BookingRecord {
@PrimaryKeyColumn(
ordinal = 0,
type = PrimaryKeyType.PARTITIONED
)
private UUID bookingId = null; …Run Code Online (Sandbox Code Playgroud) 我有以下列族:
@Table(value = "request_event")
public class RequestEvent {
@PrimaryKeyColumn(name = "day_requested", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
private LocalDate dayRequested;
@PrimaryKeyColumn(name = "date_requested", ordinal = 1, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
private LocalDateTime dateRequested;
...
}
Run Code Online (Sandbox Code Playgroud)
由存储库存储和访问:
@Repository
public interface RequestEventRepository extends CrudRepository<RequestEvent, LocalDateTime> {
}
Run Code Online (Sandbox Code Playgroud)
不幸的requestEventRepository.findOne(localDate)是抛出异常,可能是因为它返回了多个结果.我怎样才能解决这个问题?此外,如何检索特定日期的所有结果?
我正在考虑使用 Apache Cassandra 创建一个多租户应用程序。
我可以想到三个策略:
我脑海中的声音建议我选择选项 3。
想法和影响,有人吗?
当启动我的应用程序时,总是会创建键空间,并且可能会在 PT2S 错误消息之前创建一两个表。不知何故, spring.data.cassandra.request.timeout 属性不被尊重,或者我的配置可能有问题?“DriverConfigLoaderBuilderCustomizer”bean 没有任何区别。
pom.xml
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<spring.framework.version>5.3.1</spring.framework.version>
Run Code Online (Sandbox Code Playgroud)
应用程序.yml
spring:
data:
cassandra:
port: 9042
keyspace-name: abc
contact-points: localhost
local-datacenter: datacenter1
replication-factor: 1
request:
timeout: 15s
connection:
init-query-timeout: 15s
Run Code Online (Sandbox Code Playgroud)
CassandraConfig.java
@Configuration
@EnableReactiveCassandraRepositories(basePackages = "a.b.c.repository")
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
@Value("${spring.data.cassandra.contactpoints}")
.
.
@Override
protected String getKeyspaceName() {
return keyspace;
}
@Override protected String getContactPoints() {
return contactPoints;
}
@Override protected int getPort() {
return port;
}
@Override
protected String getLocalDataCenter() {
return datacenter;
} …Run Code Online (Sandbox Code Playgroud) 问题:我们的一位新客户希望将数据存储在他自己的国家(法律规定)。但是,我们使用分布在不同国家/地区的几个数据中心的现有客户数据。
问题:如何在不改变现有 Cassandra 架构的情况下,将新客户的数据分离到其本国?
潜在解决方案 #1:为此客户使用单独的密钥空间。键空间之间的模式将是相同的,这增加了数据迁移等的复杂性。DataStax 支持确认可以为每个区域配置密钥空间。但是我们使用的 Spring Data Cassandra 不允许动态选择键空间。唯一的方法是使用 CqlTemplate 并在use keyspace blabla每次调用之前运行或在表之前添加键空间,select * from blabla.mytable但这对我来说听起来像是一个黑客。
潜在的解决方案#2为新客户使用单独的环境,但管理层拒绝这样做。
还有其他方法可以实现这个目标吗?
我正在尝试使用复合主键类使用 Spring Data Cassandra。但是当我尝试查询数据时出现异常:
org.springframework.data.repository.query.QueryCreationException: **Could not create query for public abstract java.util.List com.amdocs.cassandrapoc.repository.ServiceRepository.findByKey(com.amdocs.cassandrapoc.entities.Key)! Reason: Cannot use composite primary key directly. Reference a property of the composite primary key**
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
@PrimaryKeyClass
public class Key implements Serializable {
@PrimaryKeyColumn(name = "id", ordinal = 0, type =
PrimaryKeyType.PARTITIONED)
@CassandraType(type = DataType.Name.UUID)
private UUID id;
@PrimaryKeyColumn(name = "tenant", ordinal = 1, type =
PrimaryKeyType.PARTITIONED)
@CassandraType(type = DataType.Name.TEXT)
private String tenant;
(Equals, hashcode, getters, setters omitted)
}
Table(value = "service")
public class Service implements …Run Code Online (Sandbox Code Playgroud) java composite-key cassandra spring-data spring-data-cassandra