Below is a Cassandra Template Integrated with ObjectPool Created in previous post
This has been tested with 30 parallel sessions opened to cassandra
We create one cluster object per application but we can create as many session as your system and configuration permits..
Note: Best way to create session is not attaching them to any keyspace.. so that we can reuse the same session/connections for multiple threads.
/** * */ package com.linkwithweb.products.daolayer.cassandra; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.HostDistance; import com.datastax.driver.core.PoolingOptions; import com.datastax.driver.core.QueryOptions; import com.datastax.driver.core.Session; import com.linkwithweb.products.daolayer.ObjectPool; /** * @author ashwinrayaprolu * */ @Configuration @PropertySource(value = { "classpath:cassandra.properties" }) public class CassandraTemplate extends ObjectPool<Session> { private static final Log LOG = LogFactory.getLog(CassandraTemplate.class); @Autowired private Environment env; public CassandraTemplate() { this(4, 7, 5, 40); } /** * @param minIdle * @param maxIdle * @param validationInterval * @param maxConnections */ public CassandraTemplate(int minIdle, int maxIdle, long validationInterval, int maxConnections) { super(minIdle, maxIdle, validationInterval, maxConnections); } /** * @return */ @Bean public Cluster cassandraCluster() { Cluster cluster = null; try { PoolingOptions poolingOptions = new PoolingOptions(); ; poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 4).setMaxConnectionsPerHost(HostDistance.LOCAL, 10) .setCoreConnectionsPerHost(HostDistance.REMOTE, 2).setMaxConnectionsPerHost(HostDistance.REMOTE, 4).setHeartbeatIntervalSeconds(60); cluster = Cluster.builder() // (1) .addContactPoint(env.getProperty("cassandra.contactpoints")).withQueryOptions(new QueryOptions().setFetchSize(2000)) .withPoolingOptions(poolingOptions).build(); } catch (Exception e) { e.printStackTrace(); } finally { } return cluster; } /** * @return * @throws Exception */ public Session cassandraSession() throws Exception { Session session = cassandraCluster().connect(); // (2) return session; } @Override protected Session create() { try { return cassandraSession(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public void close(Session object) { object.close(); } }