与Apache Cassandra的SoapUI JDBC连接

有没有人知道如何使用SoapUI中的JDBC连接字符串连接到cassandra。

我试过了,但无法连接。 根据研究我才知道org.apache.cassandra.cql.jdbc.CassandraDriver不支持。

我正在使用以下信息。

  • 驱动程序: org.apache.cassandra.cql.jdbc.CassandraDriver
  • 连接字符串: jdbc:cassandra://localhost:8080/test3

这些天Thrift在Cassandra接口方面已经死了,你需要使用本机CQL协议来做任何有用的事情。 幸运的是,如果这是您唯一的集成选项,则可以使用JDBC包装器 ,并且本机驱动程序的概念将比旧的Thrift协议更好地映射到JDBC。

JDBC驱动程序类:com.github.adejanovski.cassandra.jdbc.CassandraDriver

JDBC URL:jdbc:cassandra:// host1 – host2 – host3:9042 / keyspace

其中9042是默认的本机传输端口,可通过cassandra.yaml进行配置。

似乎还有用于Cassandra 3.x的基于Thrift的JDBC驱动程序的更新版本 ,但Apache或Cassandra开发人员不再支持它。


由于这里的其他答案一直在共享(有时是虚假的)依赖关系的固定列表,我认为我最好提一下正确的依赖关系管理,因为如果不同的jar版本都不匹配,很多事情都行不通(特别是,2.x到3.x是Cassandra本身和cassandra-driver-core的重大变化。

上面提到的包装器项目包含一个pom.xml,它指定所有依赖项并发布到Maven Central 。 您应该能够使用任意数量的依赖管理工具(包括maven,ivy或grape)来解析和下载特定驱动程序版本所需的所有jar。

或者,开发人员似乎提供了一个包含所有必需依赖项的jar,但这将与特定的驱动程序版本相关联。

这很有趣,我从来没有和Cassandra合作过,所以我花了一些时间才想出这个,我想我有。

要使用Cassandra,您需要多个jar文件,下面是我使用的文件的屏幕截图。 在此处输入图像描述

我使用cassandra-cli找出正确的端口号,在我的例子中它是9160

正确的连接字符串是jdbc:cassandra://localhost:9160/soapuikeyspace ,正确的驱动程序是org.apache.cassandra.cql.jdbc.CassandraDriver 。 当我试图从JDBC步骤访问Cassandra时我能够成功连接到Cassandra但是当我尝试运行一个选择查询时我得到了

获得回复时出错

和soapUI日志中的以下错误跟踪

 Sat Apr 05 17:33:09 ADT 2014:ERROR:java.sql.SQLFeatureNotSupportedException java.sql.SQLFeatureNotSupportedException at org.apache.cassandra.cql.jdbc.CassandraResultSet$CResultSetMetaData.getTableName(CassandraResultSet.java:1307) at com.eviware.soapui.support.xml.XmlUtils.addResultSetXmlPart(XmlUtils.java:1712) at com.eviware.soapui.support.xml.XmlUtils.createJdbcXmlResult(XmlUtils.java:1651) at com.eviware.soapui.impl.wsdl.panels.teststeps.JdbcResponse.(JdbcResponse.java:38) at com.eviware.soapui.impl.wsdl.panels.teststeps.JdbcSubmit.createResponse(JdbcSubmit.java:334) at com.eviware.soapui.impl.wsdl.panels.teststeps.JdbcSubmit.runQuery(JdbcSubmit.java:199) at com.eviware.soapui.impl.wsdl.panels.teststeps.JdbcSubmit.run(JdbcSubmit.java:161) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 

所以这种做法是一个破产。

这不是彻底的失败,因为我能够访问Cassandra并对其运行查询。 我使用下面的代码来做到这一点。

 import java.sql.DriverManager; import java.sql.SQLFeatureNotSupportedException; import java.sql.Statement; import javax.sql.DataSource; import org.apache.cassandra.cql.jdbc.*; com.eviware.soapui.support.GroovyUtils.registerJdbcDriver("org.apache.cassandra.cql.jdbc.CassandraDriver"); def con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/soapuikeyspace"); //keyspace has to be in lowercase def stmt = con.createStatement(); //add data def qry = "insert into users (user_id, lname, fname) values (1747,'Abhishek','Asthana');" def rs = stmt.executeUpdate(qry) 

使用此代码时要记住的最重要的事情是将键空间名称写为小写。

对于任何有兴趣的人,我写了一篇关于这一切的博客 。

我能够通过创建Cassandra集群并使用它来连接到cassandra,如下所示:

 import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Session; def rs; //query def qry = "select id soapuikeyspace.users where id='aaa';" //create cluster for cassandra Cluster cluster = new Cluster.Builder().addContactPoint("localhost").withCredentials("cassandra", "cassandra").withPort(9042).build(); //get seesionm from cassandra claster session = cluster.connect(); //get result set rs = session.execute(qry); 

必需的jar子:

  • 卡桑德拉 – 全2.0.6.jar
  • 卡桑德拉驱动核心 – 2.0.1.jar
  • 网状-3.9.0.Final.jar
  • 度量芯-3.0.2.jar

我通过cql连接成功连接到Cassandra 3.x和SoapUI版本5.3.0。

这是我的步骤:

  1. 将这些jar子复制到bin / ext:

    DSE-java的驱动核心 – 1.4.0

    DSE-Java的应用程序映射-1.4.0

    度量芯-3.0.2

    netty-all-4.1.6.Final

  2. 从lib更新guava jar:

    番石榴18.0

  3. 启动soapui并创建groovy脚本:

  import com.datastax.driver.core.*; Cluster cluster = null; cluster = new Cluster.Builder().addContactPoints("127.0.0.1").withPort(9042).build(); Session session = cluster.connect(); PreparedStatement statement = session.prepare("select * from keyspace.exemple_table"); ResultSet rs = session.execute(statement.bind()); Row row = rs.one();