Cassandra 有线协议中 'duration' 的 ProtocolID?
ProtocolID for 'duration' in Cassandra wire protocol?
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' 数据类型。有一个 table(似乎)将数据类型的有线协议 protocolId
映射到实现它的包装器的 class。我已经搜索了 datastax 代码(支持这种数据类型)和 cassandra 代码,并且完全找不到正确的值,因为一切都使用枚举(耶!)而不是更不透明的 protocolId ...但我没有能够找到在 Cassadra 服务器端建立关联的位置。
所以两个问题。首先,这个项目是否已经有一个分支增加了对 'duration' 类型的支持? (我希望可以对项目及其分支进行代码搜索。)
其次,协议id是什么/定义在哪里?
此时我几乎已准备好添加一些工具,因此 "unknown codec" 消息会添加更多详细信息。它可以工作,但可能很脆弱。
关于 JDBC 与 CQL 的注意事项:我们当前的代码是几年前由某人重用我们广泛的 JDBC 基础设施编写的。它是 "good enough" 但需要维护 JDBC 驱动程序。现在很清楚,我们应该重构代码以使用 CQL,但这需要时间来编写和测试,并且客户想要一个解决方案现在。我们找到了一个商业解决方案,但它与我们的系统不兼容,因为我们从 mongo 存储而不是文件系统加载我们的 jar。 (不要问。)分叉这个驱动程序给了我们一些喘息的空间。
如果有帮助,这是 com.github.adejanovski.cassandra.jdbc
中的 table:
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 - this type has identifier 0x15 (21). You can also find all codes in the source code of the 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' 数据类型。有一个 table(似乎)将数据类型的有线协议 protocolId
映射到实现它的包装器的 class。我已经搜索了 datastax 代码(支持这种数据类型)和 cassandra 代码,并且完全找不到正确的值,因为一切都使用枚举(耶!)而不是更不透明的 protocolId ...但我没有能够找到在 Cassadra 服务器端建立关联的位置。
所以两个问题。首先,这个项目是否已经有一个分支增加了对 'duration' 类型的支持? (我希望可以对项目及其分支进行代码搜索。)
其次,协议id是什么/定义在哪里?
此时我几乎已准备好添加一些工具,因此 "unknown codec" 消息会添加更多详细信息。它可以工作,但可能很脆弱。
关于 JDBC 与 CQL 的注意事项:我们当前的代码是几年前由某人重用我们广泛的 JDBC 基础设施编写的。它是 "good enough" 但需要维护 JDBC 驱动程序。现在很清楚,我们应该重构代码以使用 CQL,但这需要时间来编写和测试,并且客户想要一个解决方案现在。我们找到了一个商业解决方案,但它与我们的系统不兼容,因为我们从 mongo 存储而不是文件系统加载我们的 jar。 (不要问。)分叉这个驱动程序给了我们一些喘息的空间。
如果有帮助,这是 com.github.adejanovski.cassandra.jdbc
中的 table:
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 - this type has identifier 0x15 (21). You can also find all codes in the source code of the Java driver 中定义。