-
Notifications
You must be signed in to change notification settings - Fork 890
JAVA-1964: Complete remaining "Coming Soon" sections in docs #1167
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
477eee5
JAVA-1964: Complete remaining "Coming Soon" sections in docs
tolbertam c9d5268
Update reconnection docs based on feedback
tolbertam 3cebd3d
Merge branch '3.x' into java1964
tolbertam bd2bc78
Process batch documentation feedback
tolbertam d88a858
UdtValue -> UDTValue
tolbertam File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,34 @@ | ||
| ## Authentication | ||
|
|
||
| *Coming soon... In the meantime, see the javadoc for [AuthProvider].* | ||
| Cassandra’s binary protocol supports [SASL]-based authentication. To enable it, use | ||
| [Cluster.Builder.withCredentials] when building your `Cluster` instance to provide the credentials | ||
| you wish to authenticate with: | ||
|
|
||
| [AuthProvider]: http://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/AuthProvider.html | ||
| ```java | ||
| Cluster.builder() | ||
| .withCredentials("bob", "mypassword") | ||
| .build(); | ||
| ``` | ||
|
|
||
| This is a shortcut for using [PlainTextAuthProvider] for simple username/password authentication | ||
| (intended to work with the server-side `PasswordAuthenticator`). This may alternatively be | ||
| provided using the [Cluster.Builder.withAuthProvider] method: | ||
|
|
||
|
|
||
| ```java | ||
| Cluster.builder() | ||
| .withAuthProvider(new PlainTextAuthProvider("bob", "mypassword")) | ||
| .build(); | ||
| ``` | ||
|
|
||
| Authentication must be configured before opening a session, it cannot be changed at runtime. | ||
|
|
||
| You can also write your own provider; it must implement [AuthProvider]. | ||
|
|
||
|
|
||
| [SASL]: https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer | ||
|
|
||
| [Cluster.Builder.withCredentials]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/Cluster.Builder.html#withCredentials-java.lang.String-java.lang.String- | ||
| [AuthProvider]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/AuthProvider.html | ||
| [Cluster.Builder.withAuthProvider]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/Cluster.Builder.html#withAuthProvider-com.datastax.driver.core.AuthProvider- | ||
| [PlainTextAuthProvider]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/PlainTextAuthProvider.html |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,21 @@ | ||
| ## Control connection | ||
|
|
||
| *Coming soon...* | ||
|
|
||
| <!-- | ||
| TODO cover: | ||
| - what the control connection is (link to init sequence in ../README.md) | ||
| - server-sent events (gossip + schema changes) | ||
| - maybe event debouncing (although it sometimes applies to other types of events) | ||
| --> | ||
| The control connection is a dedicated connection used for administrative tasks: | ||
|
|
||
| * querying system tables to learn about the cluster's topology and | ||
| [schema](../metadata/#schema-metadata); | ||
| * checking [schema agreement](../metadata/#schema-agreement); | ||
| * reacting to server events, which are used to notify the driver of external topology or schema | ||
| changes. | ||
|
|
||
| When the driver starts, the control connection is established to the first contacted node. If that | ||
| node goes down, a [reconnection](../reconnection/) is started to find another node; it is governed | ||
| by the same policy as regular connections and tries the nodes according to a query plan from the | ||
| [load balancing policy](../load_balancing/). | ||
|
|
||
| The control connection is managed independently from [regular pooled connections](../pooling/), and | ||
| used exclusively for administrative requests. It is included in [Session.State.getOpenConnections], | ||
| as well as the `open-connections` [metric](../metrics); for example, if you've configured a pool | ||
| size of 2, the control node will have 3 connections. | ||
|
|
||
| [Session.State.getOpenConnections]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/Session.State.html#getOpenConnections-com.datastax.driver.core.Host- |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,11 +1,35 @@ | ||
| ## Reconnection | ||
|
|
||
| *Coming soon... In the meantime, see the javadoc for [ReconnectionPolicy].* | ||
| If the driver loses a connection to a node, it tries to re-establish it according to a configurable | ||
| policy. This is used in two places: | ||
|
|
||
| <!-- | ||
| TODO cover: | ||
| - reconnection policy | ||
| - scheduled reconnections vs. gossip events | ||
| --> | ||
| * [connection pools](../pooling/): for each node, a session has a fixed-size pool of connections to | ||
| execute user requests. If a node is detected as down, a reconnection is started. | ||
| * [control connection](../control_connection/): a session uses a single connection to an arbitrary | ||
| node for administrative requests. If that connection goes down, a reconnection gets started; each | ||
| attempt iterates through all active nodes until one of them accepts a connection. This goes on | ||
| until we have a control node again. | ||
|
|
||
| [ReconnectionPolicy]: http://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/policies/ReconnectionPolicy.html | ||
| [ReconnectionPolicy] controls the interval between each attempt. The policy to use may be | ||
| provided using [Cluster.Builder.withReconnectionPolicy]. For example, the following configures | ||
| an [ExponentialReconnectionPolicy] with a base delay of 1 second, and a max delay of 10 minutes | ||
| (this is the default behavior). | ||
|
|
||
| ```java | ||
| Cluster.builder() | ||
| .withReconnectionPolicy(new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000)) | ||
| .build(); | ||
| ``` | ||
|
|
||
| [ConstantReconnectionPolicy] uses the same delay every time, regardless of the | ||
| previous number of attempts. | ||
|
|
||
| You can also write your own policy; it must implement [ReconnectionPolicy]. | ||
|
|
||
| For best results, use reasonable values: very low values (for example a constant delay of 10 | ||
| milliseconds) will quickly saturate your system. | ||
|
|
||
| [ReconnectionPolicy]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/policies/ReconnectionPolicy.html | ||
| [Cluster.Builder.withReconnectionPolicy]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/Cluster.Builder.html#withReconnectionPolicy-com.datastax.driver.core.policies.ReconnectionPolicy- | ||
| [ExponentialReconnectionPolicy]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/policies/ExponentialReconnectionPolicy.html | ||
| [ConstantReconnectionPolicy]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/policies/ConstantReconnectionPolicy.html |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,42 @@ | ||
| ## Batch statements | ||
|
|
||
| *Coming soon... In the meantime, see the javadoc for [BatchStatement].* | ||
| Use [BatchStatement] to execute a set of queries as a single operation (refer to | ||
| [Batching inserts, updates and deletes][batch_dse] to understand how to use batching effectively): | ||
|
|
||
| [BatchStatement]: http://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/BatchStatement.html | ||
| ```java | ||
| PreparedStatement preparedInsertExpense = | ||
| session.prepare( | ||
| "INSERT INTO cyclist_expenses (cyclist_name, expense_id, amount, description, paid) " | ||
| + "VALUES (:name, :id, :amount, :description, :paid)"); | ||
| SimpleStatement simpleInsertBalance = | ||
| new SimpleStatement("INSERT INTO cyclist_expenses (cyclist_name, balance) VALUES (?, 0) IF NOT EXISTS", | ||
| "Vera ADRIAN"); | ||
|
|
||
| BatchStatement batch = new BatchStatement(BatchStatement.Type.UNLOGGED) | ||
| .add(simpleInsertBalance) | ||
| .add(preparedInsertExpense.bind("Vera ADRIAN", 1, 7.95f, "Breakfast", false)); | ||
|
|
||
| session.execute(batch); | ||
| ``` | ||
|
|
||
| As shown in the examples above, batches can contain any combination of simple statements and bound | ||
| statements. A given batch can contain at most 65536 statements. Past this limit, addition methods | ||
| throw an `IllegalStateException`. | ||
|
|
||
| By default, batches are configured as [LOGGED]. This ensures that if any statement in the batch | ||
| succeeds, all will eventually succeed. Ensuring all queries in a batch succeed has a | ||
| performance cost. Consider using [UNLOGGED] as shown above if you do not need this capability. | ||
|
|
||
| Please note that the size of a batch is subject to the [batch_size_fail_threshold] configuration | ||
| option on the server. | ||
|
|
||
| In addition, simple statements with named parameters are currently not supported in batches (this is | ||
| due to a [protocol limitation][CASSANDRA-10246] that will be fixed in a future version). If you try | ||
| to execute such a batch, an `IllegalArgumentException` is thrown. | ||
|
|
||
| [BatchStatement]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/BatchStatement.html | ||
| [batch_dse]: http://docs.datastax.com/en/dse/5.1/cql/cql/cql_using/useBatch.html | ||
| [LOGGED]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/BatchStatement.Type.html#LOGGED | ||
| [UNLOGGED]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/BatchStatement.Type.html#UNLOGGED | ||
| [batch_size_fail_threshold]: https://docs.datastax.com/en/cassandra/3.x/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__batch_size_fail_threshold_in_kb | ||
| [CASSANDRA-10246]: https://issues.apache.org/jira/browse/CASSANDRA-10246 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,99 @@ | ||
| ## User-defined types | ||
|
|
||
| *Coming soon... In the meantime, see the javadoc for [UserType].* | ||
| [CQL user-defined types][cql_doc] are ordered sets of named, typed fields. They must be defined in a | ||
|
adutra marked this conversation as resolved.
|
||
| keyspace: | ||
|
|
||
| [UserType]: http://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/UserType.html | ||
| ``` | ||
| CREATE TYPE ks.type1 ( | ||
| a int, | ||
| b text, | ||
| c float); | ||
| ``` | ||
|
|
||
| And can then be used as a column type in tables, or a field type in other user-defined types in that | ||
| keyspace: | ||
|
|
||
| ``` | ||
| CREATE TABLE ks.collect_things ( | ||
| pk int, | ||
| ck1 text, | ||
| ck2 text, | ||
| v frozen<type1>, | ||
| PRIMARY KEY (pk, ck1, ck2) | ||
| ); | ||
|
|
||
| CREATE TYPE ks.type2 (v frozen<type1>); | ||
| ``` | ||
|
|
||
| ### Fetching UDTs from results | ||
|
|
||
| The driver maps UDT columns to the [UDTValue] class, which exposes getters and setters to access | ||
| individual fields by index or name: | ||
|
|
||
| ```java | ||
| Row row = session.execute("SELECT v FROM ks.collect_things WHERE pk = 1").one(); | ||
|
|
||
| UDTValue udtValue = row.getUDTValue("v"); | ||
| int a = udtValue.getInt(0); | ||
| String b = udtValue.getString("b"); | ||
| Float c = udtValue.getFloat(2); | ||
| ``` | ||
|
|
||
| ### Using UDTs as parameters | ||
|
|
||
| Statements may contain UDTs as bound values: | ||
|
|
||
| ```java | ||
| PreparedStatement ps = | ||
| session.prepare( | ||
| "INSERT INTO ks.collect_things (pk, ck1, ck2, v) VALUES (:pk, :ck1, :ck2, :v)"); | ||
| ``` | ||
|
|
||
| To create a new UDT value, you must first have a reference to its [UserType]. There are | ||
| various ways to get it: | ||
|
|
||
| * from the statement's metadata | ||
|
|
||
| ```java | ||
| UserType udt = (UserType) ps.getVariables().getType("v"); | ||
| ``` | ||
|
|
||
| * from the driver's [schema metadata](../metadata/#schema-metadata): | ||
|
|
||
| ```java | ||
| UserType udt = session.getMetadata().getKeyspace("ks").getUserType("type1"); | ||
| ``` | ||
|
|
||
| * from another UDT value: | ||
|
|
||
| ```java | ||
| UserType udt = udtValue.getType(); | ||
| ``` | ||
|
|
||
| Note that the driver's official API does not expose a way to build [UserType] instances manually. | ||
| This is because the type's internal definition must precisely match the database schema; | ||
| if it doesn't (for example if the fields are not in the same order), you run the risk of inserting | ||
| corrupt data, that you won't be able to read back. | ||
|
|
||
| Once you have the type, call `newValue()` and set the fields: | ||
|
|
||
| ```java | ||
| UDTValue udtValue = udt.newValue().setInt(0, 1).setString(1, "hello").setFloat(2, 2.3f); | ||
| ``` | ||
|
|
||
| And bind your UDT value like any other type: | ||
|
|
||
| ```java | ||
| BoundStatement bs = | ||
| ps.bind() | ||
| .setInt("pk", 1) | ||
| .setString("ck1", "1") | ||
| .setString("ck2", "1") | ||
| .setUDTValue("v", udtValue); | ||
| session.execute(bs); | ||
| ``` | ||
|
|
||
| [cql_doc]: https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlRefUDType.html | ||
|
|
||
| [UDTValue]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/UDTValue.html | ||
| [UserType]: https://docs.datastax.com/en/drivers/java/3.6/com/datastax/driver/core/UserType.html | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.