【问题标题】:Connecting to Cassandra 3.0.3 from WSO2 and JDBC从 WSO2 和 JDBC 连接到 Cassandra 3.0.3
【发布时间】:2016-07-10 13:47:08
【问题描述】:

我正在尝试从 Wso2 ESB 和 wso2 DSS 连接到 Cassandra DB,这两种方法都会出现相同的错误。

1) 方法一:从 WSO2 ESB 连接到 Cassandra

我们正在尝试从 Wso2 ESB 4.9 连接 Cassandra DB 3.0.3

下面是复制到 components/lib 文件夹的 jars。

(jar listing) 在master-datasource.xml下面是添加的配置。

<datasource>
        <name>CassandraDB</name>
        <description>The datasource used for cassandra</description>
                                <jndiConfig>
            <name>cassandraWSO2DB</name>
        </jndiConfig>
            <definition type="RDBMS">
            <configuration>
                <url>jdbc:cassandra://127.0.0.1:9042/sample</url>(tried with port 9160)
                <username>cassandra</username>
                <password>cassandra</password>
                <driverClassName>org.apache.cassandra.cql.jdbc.CassandraDriver</driverClassName>
                <maxActive>50</maxActive>
                <maxWait>60000</maxWait>
                <testOnBorrow>true</testOnBorrow>
                <validationQuery>SELECT COUNT(*) from sample.users</validationQuery>
                <validationInterval>30000</validationInterval>
                <defaultAutoCommit>true</defaultAutoCommit>
            </configuration>
        </definition>
    </datasource>

2) 方法 2:从 WSO2 DSS 连接到 Cassandra

我们正在尝试从 Wso2 DSS 3.5.0 连接 Cassandra DB 下面是复制到 components/lib 文件夹的 jar。

创建了数据服务并添加了数据源,下面是相同的配置:

<config enableOData="false" id="CassandraSampleId">
  <property name="url">jdbc:cassandra://127.0.0.1:9042/sample</property>
  <property name="driverClassName">org.apache.cassandra.cql.jdbc.CassandraDriver</property>

 <query id="SampleQuery" useConfig="CassandraSampleId">
  <expression>select * from users</expression>

在上述配置中,“sample”是在 Cassandra 中创建的键空间。 在这两种情况下,即1 & [2] 都面临以下相同的错误。你能建议解决这个问题吗?

java.sql.SQLNonTransientConnectionException: org.apache.thrift.transport.TTransportException: Read a negative frame size (-2080374784)!

    at org.wso2.carbon.dataservices.core.description.config.RDBMSConfig.<init>(RDBMSConfig.java:45)
    at org.wso2.carbon.dataservices.core.description.config.ConfigFactory.getRDBMSConfig(ConfigFactory.java:92)
    at org.wso2.carbon.dataservices.core.description.config.ConfigFactory.createConfig(ConfigFactory.java:60)
    at org.wso2.carbon.dataservices.core.DataServiceFactory.createDataService(DataServiceFactory.java:150)
    at org.wso2.carbon.dataservices.core.DBDeployer.createDBService(DBDeployer.java:785)
    at org.wso2.carbon.dataservices.core.DBDeployer.processService(DBDeployer.java:1139)
    at org.wso2.carbon.dataservices.core.DBDeployer.deploy(DBDeployer.java:195)
    ... 8 more
Caused by: java.sql.SQLNonTransientConnectionException: org.apache.thrift.transport.TTransportException: Read a negative frame size (-2080374784)!
        at org.apache.cassandra.cql.jdbc.CassandraConnection.<init>(CassandraConnection.java:159)
        at org.apache.cassandra.cql.jdbc.CassandraDriver.connect(CassandraDriver.java:92)
        at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:278)
        at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:701)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:127)
        at org.wso2.carbon.dataservices.core.description.config.SQLConfig.createConnection(SQLConfig.java:187)
        at org.wso2.carbon.dataservices.core.description.config.SQLConfig.createConnection(SQLConfig.java:173)
        at org.wso2.carbon.dataservices.core.description.config.SQLConfig.initSQLDataSource(SQLConfig.java:151)
        at org.wso2.carbon.dataservices.core.description.config.RDBMSConfig.<init>(RDBMSConfig.java:43)
        ... 14 more
Caused by: org.apache.thrift.transport.TTransportException: Read a negative frame size (-2080374784)!
        at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:133)
        at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101)
        at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
        at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378)
        at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:297)
        at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:204)
        at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:69)
        at org.apache.cassandra.thrift.Cassandra$Client.recv_describe_cluster_name(Cassandra.java:1101)
        at org.apache.cassandra.thrift.Cassandra$Client.describe_cluster_name(Cassandra.java:1089)
        at org.apache.cassandra.cql.jdbc.CassandraConnection.<init>(CassandraConnection.java:130)

【问题讨论】:

    标签: cassandra wso2esb thrift wso2dss cassandra-3.0


    【解决方案1】:
    <query id="SampleQuery" useConfig="CassandraSampleId">
      <expression>select * from users</expression>
    
    <validationQuery>SELECT COUNT(*) from sample.users</validationQuery>
    

    我注意到的第一件事...未绑定的查询不是在 Cassandra 中做的一个好主意。您应该始终使用分区键进行查询。这不会解决您的问题,但您绝对不希望在具有数百万行的生产环境中这样做。

    我们正在尝试从 Wso2 ESB 4.9 连接 Cassandra DB 3.0.3

           <definition type="RDBMS">
            <configuration>
                <url>jdbc:cassandra://127.0.0.1:9042/sample</url>(tried with port 9160)
    
    org.apache.thrift.transport.TTransportException: 
    

    好的,我在这里注意到了几件事。我从未使用过 WSO2(实际上,我不知道它是什么),但看起来它在这里做了几个(错误的)假设。

    • 我不知道您对“类型”的选择是什么,但 Cassandra 绝对不是 RDBMS。
    • 我看到您正在使用 JDBC。有许多驱动程序可以与 Java 中的 Cassandra 进行交互。 JDBC 最初是为关系数据库设计的,并且增强了 与 Cassandra 一起使用。使用 DataStax Java 驱动程序,您将获得最大的成功机会,尤其是在您运行 Cassandra 3.x 时。
    • 我看到它抛出了thrift.transport.TTransportException。 Cassandra 3.0.3 安装时默认禁用 thrift (9160) 协议。将端口更改为 9042 还不够……您需要使用本机二进制协议才能正常工作。

    首先要尝试的是在 Cassandra 节点中重新启用 Thrift。在您的 cassandra.yaml 中,找到 start_rpc 属性,并将其设置为 true:

    start_rpc: true
    

    至少,这将使 Thrift 在 9160 上运行,您将准备好再次尝试连接。但是,我不知道 JDBC 是否甚至可以与 Cassandra 3.x 一起使用。如果是这样,您肯定不会获得所有可用的功能。

    我在这里看到的最大问题是,您正在尝试将新版本的 Cassandra 与实际上并非旨在与之交互的技术一起使用。但是尝试在 Cassandra 中启动 Thrift,看看是否有帮助。如果有的话,它应该让你解决下一个问题。

    【讨论】:

    • @kishoreNagula 我在这里提出的建议有帮助吗?你能得到这个工作吗?
    • 嗨亚伦,感谢您调查问题。尝试使用 start_rpc: true 但仍然是同样的错误。也使用了不同版本的 cassandra 驱动程序。没有运气。
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2016-12-22
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2013-07-13
    相关资源
    最近更新 更多