java - Cassandra 有线协议(protocol)中的 ProtocolID 为 'duration'?

标签 java jdbc cassandra datastax-java-driver

https://github/adejanovski/cassandra-jdbc-wrapper很棒,但有点过时了。例如,它的目标是 Java 1.6,它使用关键库 (datastax) 的 3.0.0 版本,其中最终版本是 3.8.0(当前版本是 4.4)等。它可以连接到 Cassandra 3.x但缺少一些最新功能。

我们已经能够 fork 该项目并将 datastax 库更新到 3.8.0,但我一直坚持添加“duration”数据类型。有一个表(似乎)将数据类型的有线协议(protocol)的 protocolId 映射到实现它的包装器类。我搜索了 datastax 代码(支持这种数据类型)和 cassandra 代码,但完全找不到正确的值,因为所有内容都使用枚举(耶!)而不是更不透明的 protocolId...但我还没有能够找到 Cassadra 服务器端的关联位置。

所以有两个问题。首先,这个项目是否已经有一个分支增加了对“持续时间”类型的支持? (我希望可以对项目及其分支进行代码搜索。)

第二,协议(protocol) ID 是什么/它在哪里定义?

此时,我几乎准备好添加一些工具,以便“未知编解码器”消息添加更多详细信息。它可以工作,但可能很脆弱。

关于 JDBC 与 CQL 的注意事项:我们当前的代码是由某人在几年前重用我们广泛的 JDBC 基础设施编写的。它“足够好”,但需要维护 JDBC 驱动程序。现在很明显,我们应该重构代码以使用 CQL,但这需要时间来编写和测试,并且客户现在就需要解决方案。我们找到了一个商业解决方案,但它与我们的系统不兼容,因为我们从 mongo 存储而不是文件系统加载 jar。 (不要问。) fork 这个驱动程序给我们一些喘息的空间。

如果有帮助的话,这是com.github.adejanovski.cassandra.jdbc中的表格:

public enum DataTypeEnum {
    ASCII     (1,  String.class, DataType.Name.ASCII),
    BIGINT    (2,  Long.class, DataType.Name.BIGINT),
    BLOB      (3,  ByteBuffer.class, DataType.Name.BLOB),
    BOOLEAN   (4,  Boolean.class, DataType.Name.BOOLEAN),
    COUNTER   (5,  Long.class, DataType.Name.COUNTER),
    DECIMAL   (6,  BigDecimal.class, DataType.Name.DECIMAL),
    DOUBLE    (7,  Double.class, DataType.Name.DOUBLE),
    FLOAT     (8,  Float.class, DataType.Name.FLOAT),
    INET      (16, InetAddress.class, DataType.Name.INET),
    INT       (9,  Integer.class, DataType.Name.INT),
    TEXT      (10, String.class, DataType.Name.TEXT),
    TIMESTAMP (11, Date.class, DataType.Name.TIMESTAMP),
    UUID      (12, UUID.class, DataType.Name.UUID),
    VARCHAR   (13, String.class, DataType.Name.VARCHAR),
    VARINT    (14, BigInteger.class, DataType.Name.VARINT),
    TIMEUUID  (15, UUID.class, DataType.Name.TIMEUUID),
    LIST      (32, List.class, DataType.Name.LIST),
    SET       (34, Set.class, DataType.Name.SET),
    MAP       (33, Map.class, DataType.Name.MAP),
    UDT       (48, UDTValue.class, DataType.Name.UDT),
    TUPLE     (49, TupleValue.class, DataType.Name.TUPLE),
    CUSTOM    (0,  ByteBuffer.class, DataType.Name.CUSTOM),       
    SMALLINT  (19, Integer.class, DataType.Name.SMALLINT),
    TINYINT   (20, Integer.class, DataType.Name.TINYINT),
    DATE      (17, Date.class, DataType.Name.DATE),
    TIME      (18, Date.class, DataType.Name.TIME),
    DURATION  (???, Duration.class, DataType.Name.DURATION);

    final int protocolId;
    final Class<?> javaType;
    final Name cqlType;

    private static final DataTypeEnum[] nameToIds;
    private static final Map<DataType.Name, DataTypeEnum> cqlDataTypeToDataType;

最佳答案

类型代码及其编码信息在 CQL protocol specification - Duration type is in the version 5 中定义。 - 该类型的标识符为 0x15 (21)。您还可以在 source code of the Java driver 中找到所有代码.

关于java - Cassandra 有线协议(protocol)中的 ProtocolID 为 'duration'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59988468/

相关文章:

cassandra - 更新 Cassandra 表中的行是否也会改变写入时间?

java - 替代 JDBC-ODBC 桥

mysql - 无法安装 mysql-connector-java,没有可用的包

java - 哪种 ruby​​ 类型映射到 jruby 中的 java.io.File?

java - 相当于Clojure中的imshow?

java - 插入日期并得到错误的格式

node.js - 使用 CQL 的 Cassandra 中的宽行 - 出现奇怪的错误

node.js - Cassandra:操作超时

java - 有没有办法在解码到 Java 对象时替换无效的 XML 数据?

java - CommunicationException [根异常是 ConnectException : Connection timed out]