Staying Ahead of the Curve
with Spring and Cassandra 4
2020-09-02 @ SpringOne
Alex Dutra, DataStax @alexdut
Mark Paluch, VMware @mp911de
Latest & Greatest in the Spring + Cassandra Ecosystem
What's new in...
1. Apache Cassandra™ 4.0 & DataStax Astra
2. Cassandra Driver 4.x
3. Spring Data Cassandra 3.0
4. Spring Boot 2.3
2 © 2020 Datastax, Inc. All rights reserved.
Apache Cassandra™ &
DataStax Astra
Latest & Greatest
3 © 2020 Datastax, Inc. All rights reserved.
Apache Cassandra™ 4.0 in a Nutshell
• Introducing Apache Cassandra 4.0 Beta
• Approaching GA
• First major release since 2016
• Large cross-industry effort
• Most stable Apache Cassandra version in history
© 2020 Datastax, Inc. All rights reserved.4
Apache Cassandra 4.0 Highlights
• Zero Copy Streaming
• Audit Logging
• Improved incremental repair
• Virtual tables
• Support for Java 11 and ZGC (experimental)
• Configurable ports per node
© 2020 Datastax, Inc. All rights reserved.5
Try It Out!
• 4.0-beta2 released in September 2020
• No more API changes expected
• Already stable
© 2020 Datastax, Inc. All rights reserved.6
docker run cassandra:4.0
cassandra.apache.org/download
or
DataStax Astra in a Nutshell
• Cloud-Native Cassandra as a Service
• Zero Lock-In: deploy on AWS or GCP
• REST and GraphQL endpoints
• Fully managed
• Auto-scaling
• Easy data modeling
© 2020 Datastax, Inc. All rights reserved.7
Try It Out!
• astra.datastax.com/register
• 10GB free tier!!
• Spring Boot + Spring Data + Docker example app:
github.com/DataStax-Examples/spring-data-starter
• Try it on GitPod!
© 2020 Datastax, Inc. All rights reserved.8
Cassandra Driver
Latest & Greatest
9 © 2020 Datastax, Inc. All rights reserved.
Cassandra Driver 4 in a Nutshell
• 4.0 released in 2019, latest release 4.9.0
• Major rewrite from 3.x
• Asynchronous, non-blocking engine
• Execution profiles
• Global timeouts
• Improved load balancing policy
• Improved metrics
• Improved Object Mapper
• Support for Cassandra 4 and DataStax Astra
www.datastax.com/blog/2019/03/introducing-java-driver-4
© 2020 Datastax, Inc. All rights reserved.10
Upgrading to Cassandra Driver 4
• Maven coordinates changed
• Package names changed
com.datastax.driver -> com.datastax.oss.driver
• Having trouble migrating to driver 4? We can help!
• Follow the Upgrade guide:
docs.datastax.com/en/developer/java-driver/latest/upgrade_guide
• Ask questions at community.datastax.com
• Driver mailing list:
groups.google.com/a/lists.datastax.com/g/java-driver-user
© 2020 Datastax, Inc. All rights reserved.11
New:
<dependency>
<groupId>com.datastax.oss</groupId>
<artifactId>java-driver-core</artifactId>
<version>4.8.0</version>
</dependency>
Old:
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.10.1</version>
</dependency>
Upgrading to Cassandra Driver 4
• Cluster + Session = CqlSession
© 2020 Datastax, Inc. All rights reserved.12
Cluster cluster = null;
try {
cluster = Cluster.builder()
.addContactPoints(...)
.build();
Session session = cluster.connect();
session.execute(...);
} finally {
if (cluster != null) cluster.close();
}
try (CqlSession session =
CqlSession
.builder()
.addContactPoint(...)
.build()) {
session.execute(...);
}
Old: New:
Upgrading to Cassandra Driver 4
• No more Guava!
© 2020 Datastax, Inc. All rights reserved.13
Futures.addCallback(
session.executeAsync(...), // Guava future
new FutureCallback<ResultSet>() {
public void onSuccess(ResultSet rs) {
Row row = rs.one();
process(row);
}
public void onFailure(Throwable t) {
t.printStackTrace();
}
});
session
.executeAsync(...) // Java 8 future
.thenApply(rs -> rs.one())
.whenComplete(
(row, error) -> {
if (error == null) {
process(row);
} else {
error.printStackTrace();
}
});
Old: New:
�� ��
Upgrading to Cassandra Driver 4
• Immutability by default, except for builders
© 2020 Datastax, Inc. All rights reserved.14
PreparedStatement ps = ...;
BoundStatement bs = ps.bind();
bs.setInt("k", 42);
PreparedStatement ps = ...;
BoundStatement bs = ps.bind();
bs = bs.setInt("k", 42); // bs is immutable!!
Old: New:
⚠
BoundStatementBuilder builder =
ps.boundStatementBuilder();
builder.setInt("k", 42); // OK, mutable
bs = builder.build();
Alternatively, switch to builders (new):
Upgrading to Cassandra Driver 4
• Configure your IDE to detect @CheckReturnValue!
© 2020 Datastax, Inc. All rights reserved.15
Upgrading to Cassandra Driver 4
• New asynchronous pagination API
© 2020 Datastax, Inc. All rights reserved.16
ResultSetFuture rs = session.executeAsync(...);
ListenableFuture<Void> done =
Futures.transform(rs, process(1));
AsyncFunction<ResultSet, Void> process(int page) {
return rs -> {
// process current page
int remaining = rs.getAvailableWithoutFetching();
for (Row row : rs) {
...; if (--remaining == 0) break;
}
// process next page, if any
boolean hasMorePages =
rs.getExecutionInfo().getPagingState() != null;
return hasMorePages
? Futures.transform(
rs.fetchMoreResults(), process(page + 1))
: Futures.immediateFuture(null);
};
}
��
��
��
CompletionStage<AsyncResultSet> rs =
session.executeAsync(...);
CompletionStage<Void> done =
rs.thenCompose(this::process);
CompletionStage<Void> process(AsyncResultSet rs) {
// process current page
rs.currentPage().forEach(row -> ...);
// process next page, if any
return rs.hasMorePages()
? rs.fetchNextPage().thenCompose(this::process)
: CompletableFuture.completedFuture(null);
}
Old: New:
��
��
��
Cassandra Driver 4 Highlights
• New Reactive API
© 2020 Datastax, Inc. All rights reserved.17
// ReactiveResultSet extends Publisher<ReactiveRow>
ReactiveResultSet rs = session.executeReactive("SELECT ...");
// Wrap with Reactor (or RxJava)
Flux.from(rs)
.doOnNext(System.out::println)
.blockLast(); // query execution happens here
docs.datastax.com/en/developer/java-driver/latest/manual/core/reactive
Cassandra 4 Support
• Multiple ports per node
• Contact points now must be entered with a port number
• Virtual tables
• Can be queried like normal tables
• New methods:
KeyspaceMetadata.isVirtual()
TableMetadata.isVirtual()
© 2020 Datastax, Inc. All rights reserved.18
Spring Data Cassandra 3.0
19 © 2020 Datastax, Inc. All rights reserved.
Spring Data Cassandra 3.0
• Upgraded to Cassandra driver 4 in Neumann release train (3.0)
• Embedded Objects (@Embedded(prefix = …))
• @Value support for object creation
• Customizable NamingStrategy API
© 2020 Datastax, Inc. All rights reserved.20
Upgrading to Spring Data Cassandra 3.0
• Your mileage varies depending on level of data access abstraction,
meaning:
• Repository vs. CassandraOperations usage
• Usage of CqlOperations and async CqlOperations Statement
API requires special attention
• Driver Statement objects are now immutable
• Migration guide shipped with reference documentation
• Lots of internal changes as consequence of driver design
© 2020 Datastax, Inc. All rights reserved.21
Upgrade Tasks
• Dependency Upgrades (Driver, Spring Data)
• Adapt mapped entities to
• changed DATE type (com.datastax.driver.core.LocalDate ->
java.time.LocalDate)
• Changes in @CassandraType (CassandraType.Name enum)
• forceQuote in annotations deprecated now
• Review and adapt configuration
© 2020 Datastax, Inc. All rights reserved.22
Configuration
• Recommended: Use Spring Boot
• Still using XML: cassandra:cluster and cassandra:session now
cassandra:session and cassandra:session-factory namespace
elements
• Programmatic configuration mostly remains the same (YMMV!)
© 2020 Datastax, Inc. All rights reserved.23
Execution Profiles
© 2020 Datastax, Inc. All rights reserved.24
datastax-java-driver {
profiles {
oltp {
basic.request.timeout = 100 milliseconds
basic.request.consistency = ONE
}
olap {
basic.request.timeout = 5 seconds
basic.request.consistency = QUORUM
}
}
• Associate Statement with settings
• Driver configuration referenced by Statement API objects
Execution Profiles (Code)
© 2020 Datastax, Inc. All rights reserved.25
CqlTemplate template = new CqlTemplate();
SimpleStatement simpleStatement = QueryBuilder.….build();
SimpleStatement newStatement = simpleStatement.setExecutionProfileName("olap");
template.queryForList(newStatement);
CqlTemplate olapTemplate = new CqlTemplate();
olapTemplate.setExecutionProfile("olap");
CassandraTemplate cassandraTemplate = …
InsertOptions options = InsertOptions.builder().executionProfile("oltp").build();
cassandraTemplate.insert(person, options);
Embedded Objects
© 2020 Datastax, Inc. All rights reserved.26
public class Customer {
@Id
UUID id;
@Embedded.Nullable(prefix = "billing_")
Address billing;
@Embedded.Nullable(prefix = "shipping_")
Address shipping;
static class Address {
String street;
String city;
String zip;
}
}
Embedded Objects
• Flattened when persisted
• Materialized as nested object
• Allow for namespacing through prefix
• Can be null or empty
© 2020 Datastax, Inc. All rights reserved.27
Spring Boot 2.3
28 © 2020 Datastax, Inc. All rights reserved.
Spring Boot 2.3
• Upgraded to Cassandra driver 4 in 2.3
• Configuration must be done either:
• In application.properties or application.yaml
• Under spring.data.cassandra prefix
• Or programmatically
• Changes to spring.data.cassandra properties:
• Some properties were renamed
• Contact points must now contain a port (host:port)
• Local datacenter is now required
• Except for Astra
© 2020 Datastax, Inc. All rights reserved.29
Configuration Upgrade Example
Old:
spring.data.cassandra:
cluster-name: prod1
contact-points: 127.0.0.1
port: 9042
keyspace-name: ks1
read-timeout: 10s
consistency-level: LOCAL_QUORUM
fetch-size: 1000
30 © 2020 Datastax, Inc. All rights reserved.
New:
spring.data.cassandra:
session-name: prod1
contact-points: 127.0.0.1:9042
local-datacenter: dc1
keyspace-name: ks1
request:
timeout: 10s
consistency: LOCAL_QUORUM
page-size: 1000
Upgrading Application Properties
31 © 2020 Datastax, Inc. All rights reserved.
docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
Old property New property
spring.data.cassandra.cluster-name spring.data.cassandra.session-name
N/A spring.data.cassandra.local-datacenter
spring.data.cassandra.read-timeout
spring.data.cassandra.connect-timeout
spring.data.cassandra.request.timeout
spring.data.cassandra.connection.connect-timeout
spring.data.cassandra.connection.init-query-timeout
spring.data.cassandra.consistency-level
spring.data.cassandra.serial-consistency-level
spring.data.cassandra.request.consistency
spring.data.cassandra.request.serial-consistency
spring.data.cassandra.fetch-size spring.data.cassandra.request.page-size
spring.data.cassandra.jmx-enabled N/A (driver JMX config)
Customizing the Cassandra Session
• Avoid declaring your own CqlSession bean!
• You would lose Spring Boot's auto-configuration support
• Customizers FTW!
• Callbacks that can be easily implemented by users
• Spring Boot 2.3+ customizers:
• SessionBuilderCustomizer (High-level)
• DriverConfigLoaderBuilderCustomizer (Low-level,
execution profiles)
• Declare as regular beans
© 2020 Datastax, Inc. All rights reserved.32
Customizing the Cassandra Session
• Session customization examples
© 2020 Datastax, Inc. All rights reserved.33
@Bean
public CqlSessionBuilderCustomizer sslCustomizer() {
return builder -> builder.withSslContext(…);
}
@Bean
public CqlSessionBuilderCustomizer credentialsCustomizer() {
return builder -> builder.withAuthCredentials(…);
}
@Bean
public DriverConfigLoaderBuilderCustomizer oltpProfile() {
return builder -> builder.startProfile("oltp"). … .endProfile();
}
Connecting to Astra
• Typical configuration
© 2020 Datastax, Inc. All rights reserved.34
spring.data.cassandra:
username: <astra user>
password: <astra password>
keyspace-name: <astra keyspace>
# no contact-points and no local-datacenter for Astra!
datastax.astra:
secure-connect-bundle: </path/to/secure-connect-bundle.zip>
docs.datastax.com/en/developer/java-driver/latest/manual/cloud
Connecting to Astra
• Passing the secure connect bundle: with a customizer bean
© 2020 Datastax, Inc. All rights reserved.35
@Value("${datastax.astra.secure-connect-bundle}")
private String astraBundle;
@Bean
public CqlSessionBuilderCustomizer sessionBuilderCustomizer() {
return builder ->
builder.withCloudSecureConnectBundle(Paths.get(astraBundle));
}
docs.datastax.com/en/developer/java-driver/latest/manual/cloud
Compatibility Matrix
36 © 2020 Datastax, Inc. All rights reserved.
Your driver version works with...
Cassandra Driver Spring Data Cassandra Spring Boot
3.x 2.2 and older 2.2 and older
4.x 3.0 and newer 2.3 and newer
• Can't mix versions from different lines
Thank You!
37 © 2020 Datastax, Inc. All rights reserved.

Staying Ahead of the Curve with Spring and Cassandra 4 (SpringOne 2020)

  • 1.
    Staying Ahead ofthe Curve with Spring and Cassandra 4 2020-09-02 @ SpringOne Alex Dutra, DataStax @alexdut Mark Paluch, VMware @mp911de Latest & Greatest in the Spring + Cassandra Ecosystem
  • 2.
    What's new in... 1.Apache Cassandra™ 4.0 & DataStax Astra 2. Cassandra Driver 4.x 3. Spring Data Cassandra 3.0 4. Spring Boot 2.3 2 © 2020 Datastax, Inc. All rights reserved.
  • 3.
    Apache Cassandra™ & DataStaxAstra Latest & Greatest 3 © 2020 Datastax, Inc. All rights reserved.
  • 4.
    Apache Cassandra™ 4.0in a Nutshell • Introducing Apache Cassandra 4.0 Beta • Approaching GA • First major release since 2016 • Large cross-industry effort • Most stable Apache Cassandra version in history © 2020 Datastax, Inc. All rights reserved.4
  • 5.
    Apache Cassandra 4.0Highlights • Zero Copy Streaming • Audit Logging • Improved incremental repair • Virtual tables • Support for Java 11 and ZGC (experimental) • Configurable ports per node © 2020 Datastax, Inc. All rights reserved.5
  • 6.
    Try It Out! •4.0-beta2 released in September 2020 • No more API changes expected • Already stable © 2020 Datastax, Inc. All rights reserved.6 docker run cassandra:4.0 cassandra.apache.org/download or
  • 7.
    DataStax Astra ina Nutshell • Cloud-Native Cassandra as a Service • Zero Lock-In: deploy on AWS or GCP • REST and GraphQL endpoints • Fully managed • Auto-scaling • Easy data modeling © 2020 Datastax, Inc. All rights reserved.7
  • 8.
    Try It Out! •astra.datastax.com/register • 10GB free tier!! • Spring Boot + Spring Data + Docker example app: github.com/DataStax-Examples/spring-data-starter • Try it on GitPod! © 2020 Datastax, Inc. All rights reserved.8
  • 9.
    Cassandra Driver Latest &Greatest 9 © 2020 Datastax, Inc. All rights reserved.
  • 10.
    Cassandra Driver 4in a Nutshell • 4.0 released in 2019, latest release 4.9.0 • Major rewrite from 3.x • Asynchronous, non-blocking engine • Execution profiles • Global timeouts • Improved load balancing policy • Improved metrics • Improved Object Mapper • Support for Cassandra 4 and DataStax Astra www.datastax.com/blog/2019/03/introducing-java-driver-4 © 2020 Datastax, Inc. All rights reserved.10
  • 11.
    Upgrading to CassandraDriver 4 • Maven coordinates changed • Package names changed com.datastax.driver -> com.datastax.oss.driver • Having trouble migrating to driver 4? We can help! • Follow the Upgrade guide: docs.datastax.com/en/developer/java-driver/latest/upgrade_guide • Ask questions at community.datastax.com • Driver mailing list: groups.google.com/a/lists.datastax.com/g/java-driver-user © 2020 Datastax, Inc. All rights reserved.11 New: <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-core</artifactId> <version>4.8.0</version> </dependency> Old: <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>3.10.1</version> </dependency>
  • 12.
    Upgrading to CassandraDriver 4 • Cluster + Session = CqlSession © 2020 Datastax, Inc. All rights reserved.12 Cluster cluster = null; try { cluster = Cluster.builder() .addContactPoints(...) .build(); Session session = cluster.connect(); session.execute(...); } finally { if (cluster != null) cluster.close(); } try (CqlSession session = CqlSession .builder() .addContactPoint(...) .build()) { session.execute(...); } Old: New:
  • 13.
    Upgrading to CassandraDriver 4 • No more Guava! © 2020 Datastax, Inc. All rights reserved.13 Futures.addCallback( session.executeAsync(...), // Guava future new FutureCallback<ResultSet>() { public void onSuccess(ResultSet rs) { Row row = rs.one(); process(row); } public void onFailure(Throwable t) { t.printStackTrace(); } }); session .executeAsync(...) // Java 8 future .thenApply(rs -> rs.one()) .whenComplete( (row, error) -> { if (error == null) { process(row); } else { error.printStackTrace(); } }); Old: New: �� ��
  • 14.
    Upgrading to CassandraDriver 4 • Immutability by default, except for builders © 2020 Datastax, Inc. All rights reserved.14 PreparedStatement ps = ...; BoundStatement bs = ps.bind(); bs.setInt("k", 42); PreparedStatement ps = ...; BoundStatement bs = ps.bind(); bs = bs.setInt("k", 42); // bs is immutable!! Old: New: ⚠ BoundStatementBuilder builder = ps.boundStatementBuilder(); builder.setInt("k", 42); // OK, mutable bs = builder.build(); Alternatively, switch to builders (new):
  • 15.
    Upgrading to CassandraDriver 4 • Configure your IDE to detect @CheckReturnValue! © 2020 Datastax, Inc. All rights reserved.15
  • 16.
    Upgrading to CassandraDriver 4 • New asynchronous pagination API © 2020 Datastax, Inc. All rights reserved.16 ResultSetFuture rs = session.executeAsync(...); ListenableFuture<Void> done = Futures.transform(rs, process(1)); AsyncFunction<ResultSet, Void> process(int page) { return rs -> { // process current page int remaining = rs.getAvailableWithoutFetching(); for (Row row : rs) { ...; if (--remaining == 0) break; } // process next page, if any boolean hasMorePages = rs.getExecutionInfo().getPagingState() != null; return hasMorePages ? Futures.transform( rs.fetchMoreResults(), process(page + 1)) : Futures.immediateFuture(null); }; } �� �� �� CompletionStage<AsyncResultSet> rs = session.executeAsync(...); CompletionStage<Void> done = rs.thenCompose(this::process); CompletionStage<Void> process(AsyncResultSet rs) { // process current page rs.currentPage().forEach(row -> ...); // process next page, if any return rs.hasMorePages() ? rs.fetchNextPage().thenCompose(this::process) : CompletableFuture.completedFuture(null); } Old: New: �� �� ��
  • 17.
    Cassandra Driver 4Highlights • New Reactive API © 2020 Datastax, Inc. All rights reserved.17 // ReactiveResultSet extends Publisher<ReactiveRow> ReactiveResultSet rs = session.executeReactive("SELECT ..."); // Wrap with Reactor (or RxJava) Flux.from(rs) .doOnNext(System.out::println) .blockLast(); // query execution happens here docs.datastax.com/en/developer/java-driver/latest/manual/core/reactive
  • 18.
    Cassandra 4 Support •Multiple ports per node • Contact points now must be entered with a port number • Virtual tables • Can be queried like normal tables • New methods: KeyspaceMetadata.isVirtual() TableMetadata.isVirtual() © 2020 Datastax, Inc. All rights reserved.18
  • 19.
    Spring Data Cassandra3.0 19 © 2020 Datastax, Inc. All rights reserved.
  • 20.
    Spring Data Cassandra3.0 • Upgraded to Cassandra driver 4 in Neumann release train (3.0) • Embedded Objects (@Embedded(prefix = …)) • @Value support for object creation • Customizable NamingStrategy API © 2020 Datastax, Inc. All rights reserved.20
  • 21.
    Upgrading to SpringData Cassandra 3.0 • Your mileage varies depending on level of data access abstraction, meaning: • Repository vs. CassandraOperations usage • Usage of CqlOperations and async CqlOperations Statement API requires special attention • Driver Statement objects are now immutable • Migration guide shipped with reference documentation • Lots of internal changes as consequence of driver design © 2020 Datastax, Inc. All rights reserved.21
  • 22.
    Upgrade Tasks • DependencyUpgrades (Driver, Spring Data) • Adapt mapped entities to • changed DATE type (com.datastax.driver.core.LocalDate -> java.time.LocalDate) • Changes in @CassandraType (CassandraType.Name enum) • forceQuote in annotations deprecated now • Review and adapt configuration © 2020 Datastax, Inc. All rights reserved.22
  • 23.
    Configuration • Recommended: UseSpring Boot • Still using XML: cassandra:cluster and cassandra:session now cassandra:session and cassandra:session-factory namespace elements • Programmatic configuration mostly remains the same (YMMV!) © 2020 Datastax, Inc. All rights reserved.23
  • 24.
    Execution Profiles © 2020Datastax, Inc. All rights reserved.24 datastax-java-driver { profiles { oltp { basic.request.timeout = 100 milliseconds basic.request.consistency = ONE } olap { basic.request.timeout = 5 seconds basic.request.consistency = QUORUM } } • Associate Statement with settings • Driver configuration referenced by Statement API objects
  • 25.
    Execution Profiles (Code) ©2020 Datastax, Inc. All rights reserved.25 CqlTemplate template = new CqlTemplate(); SimpleStatement simpleStatement = QueryBuilder.….build(); SimpleStatement newStatement = simpleStatement.setExecutionProfileName("olap"); template.queryForList(newStatement); CqlTemplate olapTemplate = new CqlTemplate(); olapTemplate.setExecutionProfile("olap"); CassandraTemplate cassandraTemplate = … InsertOptions options = InsertOptions.builder().executionProfile("oltp").build(); cassandraTemplate.insert(person, options);
  • 26.
    Embedded Objects © 2020Datastax, Inc. All rights reserved.26 public class Customer { @Id UUID id; @Embedded.Nullable(prefix = "billing_") Address billing; @Embedded.Nullable(prefix = "shipping_") Address shipping; static class Address { String street; String city; String zip; } }
  • 27.
    Embedded Objects • Flattenedwhen persisted • Materialized as nested object • Allow for namespacing through prefix • Can be null or empty © 2020 Datastax, Inc. All rights reserved.27
  • 28.
    Spring Boot 2.3 28© 2020 Datastax, Inc. All rights reserved.
  • 29.
    Spring Boot 2.3 •Upgraded to Cassandra driver 4 in 2.3 • Configuration must be done either: • In application.properties or application.yaml • Under spring.data.cassandra prefix • Or programmatically • Changes to spring.data.cassandra properties: • Some properties were renamed • Contact points must now contain a port (host:port) • Local datacenter is now required • Except for Astra © 2020 Datastax, Inc. All rights reserved.29
  • 30.
    Configuration Upgrade Example Old: spring.data.cassandra: cluster-name:prod1 contact-points: 127.0.0.1 port: 9042 keyspace-name: ks1 read-timeout: 10s consistency-level: LOCAL_QUORUM fetch-size: 1000 30 © 2020 Datastax, Inc. All rights reserved. New: spring.data.cassandra: session-name: prod1 contact-points: 127.0.0.1:9042 local-datacenter: dc1 keyspace-name: ks1 request: timeout: 10s consistency: LOCAL_QUORUM page-size: 1000
  • 31.
    Upgrading Application Properties 31© 2020 Datastax, Inc. All rights reserved. docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html Old property New property spring.data.cassandra.cluster-name spring.data.cassandra.session-name N/A spring.data.cassandra.local-datacenter spring.data.cassandra.read-timeout spring.data.cassandra.connect-timeout spring.data.cassandra.request.timeout spring.data.cassandra.connection.connect-timeout spring.data.cassandra.connection.init-query-timeout spring.data.cassandra.consistency-level spring.data.cassandra.serial-consistency-level spring.data.cassandra.request.consistency spring.data.cassandra.request.serial-consistency spring.data.cassandra.fetch-size spring.data.cassandra.request.page-size spring.data.cassandra.jmx-enabled N/A (driver JMX config)
  • 32.
    Customizing the CassandraSession • Avoid declaring your own CqlSession bean! • You would lose Spring Boot's auto-configuration support • Customizers FTW! • Callbacks that can be easily implemented by users • Spring Boot 2.3+ customizers: • SessionBuilderCustomizer (High-level) • DriverConfigLoaderBuilderCustomizer (Low-level, execution profiles) • Declare as regular beans © 2020 Datastax, Inc. All rights reserved.32
  • 33.
    Customizing the CassandraSession • Session customization examples © 2020 Datastax, Inc. All rights reserved.33 @Bean public CqlSessionBuilderCustomizer sslCustomizer() { return builder -> builder.withSslContext(…); } @Bean public CqlSessionBuilderCustomizer credentialsCustomizer() { return builder -> builder.withAuthCredentials(…); } @Bean public DriverConfigLoaderBuilderCustomizer oltpProfile() { return builder -> builder.startProfile("oltp"). … .endProfile(); }
  • 34.
    Connecting to Astra •Typical configuration © 2020 Datastax, Inc. All rights reserved.34 spring.data.cassandra: username: <astra user> password: <astra password> keyspace-name: <astra keyspace> # no contact-points and no local-datacenter for Astra! datastax.astra: secure-connect-bundle: </path/to/secure-connect-bundle.zip> docs.datastax.com/en/developer/java-driver/latest/manual/cloud
  • 35.
    Connecting to Astra •Passing the secure connect bundle: with a customizer bean © 2020 Datastax, Inc. All rights reserved.35 @Value("${datastax.astra.secure-connect-bundle}") private String astraBundle; @Bean public CqlSessionBuilderCustomizer sessionBuilderCustomizer() { return builder -> builder.withCloudSecureConnectBundle(Paths.get(astraBundle)); } docs.datastax.com/en/developer/java-driver/latest/manual/cloud
  • 36.
    Compatibility Matrix 36 ©2020 Datastax, Inc. All rights reserved. Your driver version works with... Cassandra Driver Spring Data Cassandra Spring Boot 3.x 2.2 and older 2.2 and older 4.x 3.0 and newer 2.3 and newer • Can't mix versions from different lines
  • 37.
    Thank You! 37 ©2020 Datastax, Inc. All rights reserved.