A session holds connections to a Cassandra cluster, allowing it to be queried.
Each session maintains multiple connections to the cluster nodes,
provides policies to choose which node to use for each query (round-robin on
all nodes of the cluster by default), and handles retries for failed query (when
it makes sense), etc...
Session instances are thread-safe and usually a single instance is enough
per application. However, a given session can only be set to one keyspace
at a time, so one instance per keyspace is necessary.
There's also a connection pool per host. All queries are executed asynchronously
(underneath). There are also means in the driver itself to execute them in an
async manner.