SlideShare a Scribd company logo
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.

More Related Content

PDF
Rapid Home Provisioning
PDF
Oracle Drivers configuration for High Availability
PDF
Mysql User Camp : 20-June-14 : Mysql Fabric
PDF
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
PDF
Maximum Overdrive: Tuning the Spark Cassandra Connector (Russell Spitzer, Dat...
PDF
Troubleshooting Cassandra (J.B. Langston, DataStax) | C* Summit 2016
PDF
Oracle Client Failover - Under The Hood
PDF
Galera Cluster: Synchronous Multi-Master Replication for MySQL HA
Rapid Home Provisioning
Oracle Drivers configuration for High Availability
Mysql User Camp : 20-June-14 : Mysql Fabric
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
Maximum Overdrive: Tuning the Spark Cassandra Connector (Russell Spitzer, Dat...
Troubleshooting Cassandra (J.B. Langston, DataStax) | C* Summit 2016
Oracle Client Failover - Under The Hood
Galera Cluster: Synchronous Multi-Master Replication for MySQL HA

What's hot (20)

PDF
Oracle Database on ACFS: a perfect marriage?
PDF
Habits of Effective Sqoop Users
PDF
Oracle Enteprise Manager Cloud Control 12c - Setting Up Metrics and Monitorin...
PDF
Introduction to Apache Cassandra™ + What’s New in 4.0
PPTX
How to upgrade like a boss to my sql 8.0?
PDF
Welcome to databases in the Cloud
PPTX
Why your Spark Job is Failing
PPTX
Using Spark to Load Oracle Data into Cassandra
PDF
20190817 coscup-oracle my sql innodb cluster sharing
PPTX
Migrating to Oracle Database 12c: 300 DBs in 300 days.
PDF
Mysql User Camp : 20th June - Mysql New Features
PDF
Cassandra 2.0 and timeseries
PPTX
OTN Tour 2014: Rac 11g vs 12c
PPTX
PDB Provisioning with Oracle Multitenant Self Service Application
KEY
Perf Tuning Short
PDF
MySQL Manchester TT - Performance Tuning
PDF
Apache Sqoop: Unlocking Hadoop for Your Relational Database
PDF
High Performance Hibernate JavaZone 2016
PDF
High-Performance JDBC Voxxed Bucharest 2016
PDF
Why your Spark job is failing
Oracle Database on ACFS: a perfect marriage?
Habits of Effective Sqoop Users
Oracle Enteprise Manager Cloud Control 12c - Setting Up Metrics and Monitorin...
Introduction to Apache Cassandra™ + What’s New in 4.0
How to upgrade like a boss to my sql 8.0?
Welcome to databases in the Cloud
Why your Spark Job is Failing
Using Spark to Load Oracle Data into Cassandra
20190817 coscup-oracle my sql innodb cluster sharing
Migrating to Oracle Database 12c: 300 DBs in 300 days.
Mysql User Camp : 20th June - Mysql New Features
Cassandra 2.0 and timeseries
OTN Tour 2014: Rac 11g vs 12c
PDB Provisioning with Oracle Multitenant Self Service Application
Perf Tuning Short
MySQL Manchester TT - Performance Tuning
Apache Sqoop: Unlocking Hadoop for Your Relational Database
High Performance Hibernate JavaZone 2016
High-Performance JDBC Voxxed Bucharest 2016
Why your Spark job is failing
Ad

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

PDF
Software Development with Apache Cassandra
PDF
Successful Software Development with Apache Cassandra
PPTX
DataStax NYC Java Meetup: Cassandra with Java
PDF
Geneva JUG - Cassandra for Java Developers
PDF
YaJug - Cassandra for Java Developers
PDF
Going native with Apache Cassandra
PDF
Cassandra 2.0 to 2.1
PPTX
BI, Reporting and Analytics on Apache Cassandra
PPTX
Announcing Spark Driver for Cassandra
PDF
Cassandra drivers and libraries
PDF
Paris Cassandra Meetup - Cassandra for Developers
PDF
DataStax | DataStax Tools for Developers (Alex Popescu) | Cassandra Summit 2016
PDF
Cassandra Drivers and Tools
PDF
Coursera Cassandra Driver
PDF
Cassandra hands on
PDF
Introduction to .Net Driver
PPTX
Cassandra Summit 2014: Drivers: Let Our Powers Combine!
PDF
Develop Scalable Applications with DataStax Drivers (Alex Popescu, Bulat Shak...
PPTX
Stargate, the gateway for some multi-models data API
PDF
Safer restarts, faster streaming, and better repair, just a glimpse of cassan...
Software Development with Apache Cassandra
Successful Software Development with Apache Cassandra
DataStax NYC Java Meetup: Cassandra with Java
Geneva JUG - Cassandra for Java Developers
YaJug - Cassandra for Java Developers
Going native with Apache Cassandra
Cassandra 2.0 to 2.1
BI, Reporting and Analytics on Apache Cassandra
Announcing Spark Driver for Cassandra
Cassandra drivers and libraries
Paris Cassandra Meetup - Cassandra for Developers
DataStax | DataStax Tools for Developers (Alex Popescu) | Cassandra Summit 2016
Cassandra Drivers and Tools
Coursera Cassandra Driver
Cassandra hands on
Introduction to .Net Driver
Cassandra Summit 2014: Drivers: Let Our Powers Combine!
Develop Scalable Applications with DataStax Drivers (Alex Popescu, Bulat Shak...
Stargate, the gateway for some multi-models data API
Safer restarts, faster streaming, and better repair, just a glimpse of cassan...
Ad

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Empathic Computing: Creating Shared Understanding
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Approach and Philosophy of On baking technology
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
cuic standard and advanced reporting.pdf
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
Big Data Technologies - Introduction.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
Cloud computing and distributed systems.
MYSQL Presentation for SQL database connectivity
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
The AUB Centre for AI in Media Proposal.docx
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Advanced methodologies resolving dimensionality complications for autism neur...
Diabetes mellitus diagnosis method based random forest with bat algorithm
NewMind AI Weekly Chronicles - August'25 Week I
Empathic Computing: Creating Shared Understanding
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Encapsulation_ Review paper, used for researhc scholars
Approach and Philosophy of On baking technology
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
cuic standard and advanced reporting.pdf
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Big Data Technologies - Introduction.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
20250228 LYD VKU AI Blended-Learning.pptx
Understanding_Digital_Forensics_Presentation.pptx

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

  • 1. 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
  • 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™ & DataStax Astra Latest & Greatest 3 © 2020 Datastax, Inc. All rights reserved.
  • 4. 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
  • 5. 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
  • 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 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
  • 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 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
  • 11. 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>
  • 12. 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:
  • 13. 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: �� ��
  • 14. 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):
  • 15. Upgrading to Cassandra Driver 4 • Configure your IDE to detect @CheckReturnValue! © 2020 Datastax, Inc. All rights reserved.15
  • 16. 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: �� �� ��
  • 17. 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
  • 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 Cassandra 3.0 19 © 2020 Datastax, Inc. All rights reserved.
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 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
  • 24. 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
  • 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 © 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; } }
  • 27. 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
  • 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 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
  • 33. 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(); }
  • 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.