【问题标题】:SoapUI JDBC connection with Apache CassandraSoapUI JDBC 与 Apache Cassandra 的连接
【发布时间】:2014-05-04 18:24:48
【问题描述】:

有谁知道如何在 SoapUI 中使用 JDBC 连接字符串连接到 cassandra。

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

我正在使用以下信息。

  • 司机:org.apache.cassandra.cql.jdbc.CassandraDriver
  • 连接字符串:jdbc:cassandra://localhost:8080/test3

【问题讨论】:

  • 您遇到了什么样的错误或问题?
  • 我没有得到任何响应..通常当我连接到 SQL 时,我会收到消息说连接成功,但不是 cassandra
  • 仅供参考。我正在使用 cassandra-jdbc-1.2.5.jar
  • 8080 看起来不是正确的端口
  • 您好,我什至尝试过默认端口 9160,但仍然无法连接

标签: java jdbc cassandra soapui


【解决方案1】:

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

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

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

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

似乎还有一个 updated version 的基于 Thrift 的 JDBC 驱动程序可用于 Cassandra 3.x,但 Apache 或 Cassandra 开发人员不再支持它。


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

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

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

【讨论】:

    【解决方案2】:

    这很有趣,我以前从未与 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.<init>(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)
    

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

    对于任何感兴趣的人,我写了a blog about all this

    【讨论】:

    • 感谢大家的帮助。我现在可以通过 SoapUI 连接 cassandra。
    • 使用我描述的方法还是通过其他方式?
    • 嗨 Abhishek,特别感谢您。我使用了您的信息和脚本。感谢您的帮助
    • 如果这对你有用,请接受这个作为答案。
    【解决方案3】:

    我能够通过创建 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);
    

    所需的罐子:

    • cassandra-all-2.0.6.jar
    • cassandra-driver-core-2.0.1.jar
    • netty-3.9.0.Final.jar
    • metrics-core-3.0.2.jar

    【讨论】:

      【解决方案4】:

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

      这是我的步骤:

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

        dse-java-driver-core-1.4.0

        dse-java-driver-mapping-1.4.0

        metrics-core-3.0.2

        netty-all-4.1.6.Final

      2. 从 lib 更新 guava jar:

        guava-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();

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2020-02-05
        • 2018-03-22
        • 1970-01-01
        • 2021-12-19
        • 2015-09-23
        • 2018-06-27
        • 2017-12-07
        • 1970-01-01
        相关资源
        最近更新 更多