我想用Java和Cassandra 2.x(在Jersey框架上)构建一个RESTful API.我是这两种技术的新手,所以我想问你是集成和共享Cassandra驱动程序的正确方法.
0.通过Maven获取驱动程序
com.datastax.cassandra cassandra-driver-core 2.0.3
1.使用Client类包装驱动程序的功能:
package com.example.cassandra; import com.datastax.driver.core.*; public class Client { private Cluster cluster; private Session session; public Client(String node) { connect( node ); } private void connect(String node) { cluster = Cluster.builder() .addContactPoint(node) .build(); session = cluster.connect(); } public ResultSet execute( String cql3 ) { return session.execute( cql3 ); } public void close() { cluster.close(); } }
2.我在ContextListener中启动客户端并通过上下文属性共享它
package com.example.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import com.example.cassandra.Client; public class ExampleContextListener implements ServletContextListener { Client cassandraClient; public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext ctx = servletContextEvent.getServletContext(); cassandraClient = new Client( ctx.getInitParameter( "DBHost" ) ); ctx.setAttribute( "DB", cassandraClient ); } public void contextDestroyed(ServletContextEvent servletContextEvent) { cassandraClient.close(); } }
3.现在我从servlet的上下文中获取客户端并使用它
Client client = (Client) context.getAttribute("DB"); client.execute("USE testspace;"); ResultSet rs = client.execute("SELECT * from users;"); for (Row row : rs ) { output += row.getString("lname") + "|"; }
这是正确的方法吗(从性能和架构的角度来看)?
完整示例:https://github.com/lukaszkujawa/jersey-cassandra