其他常见问题解答

Q1: Java API 如何构造一个 DolphinDB 中的字典类型?目前已知的方式是通过 run 方法执行脚本拿到字典类型的返回值来构建,请问有其他更加直接方便的实现方式吗?

A1: 实例化的时候需要设定好 key 和 value 的类型,比如 key 是 DT_INT,value 是 DT_STRING,之后调用 put 方法插入 k-v 对,代码如下:

BasicDictionary dictionary = new BasicDictionary(Entity.DATA_TYPE.DT_INT, Entity.DATA_TYPE.DT_STRING);
dictionary.put(new BasicInt(1),new BasicString("IBM"));
System.out.println(dictionary.getString());

Q2: 表是别人建的,我只知道表名,想获取表中对应的字段和类型,所以想用 columnNames 函数看下,但是使用 columnNames 参数却需要构建一个表。

A2: 如果只知道表名的情况下,可以先使用 loadTable 函数获取 table:

List<Entity> arguments1 = new ArrayList<Entity>(1); 
BasicTable table1 = (BasicTable) conn.run("loadTable('dfs://testDatabase','pt')"); 
arguments1.add(table1); 
BasicStringVector o1 = (BasicStringVector)conn.run("columnNames",arguments1); 
System.out.println(o1.getString());

Q3: Java API 构造 BasicDateVector / BasicTimeVector 需要传入 int 列表,如何将日期或时间转换为 int 类型?

A3: 可以参考如下代码:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssSSS");

Utils.countDays(LocalDate.parse(currentDate, dateFormatter))
Utils.countMilliseconds(LocalTime.parse(String.format("%09d", Integer.parseInt(localCurrentTime)), timeFormatter))

Q4: Java API 执行 tableInsert 方法后,可以获取成功插入的条数吗?

这里打印 entity.rows 没有得到成功插入的条数:

Entity entity = conn.run("tableInsert(...)")
System.out.println(entity.rows())

A4: 在 Java API 中,执行 tableInsert 的返回值 entity 是 BasicInt 类型,直接打印 entity 即可看到成功插入的记录数。

Q5: Java API 在订阅流表后可以读出数据,但是读完后不断抛出 EOFException,重连后也是如此:

Successfully reconnected and subscribed xxxx:8903/DemoStreamjavaStreamingApi
java.io.EOFException
at com.xxdb.io.AbstractExtendedDataInputStream.readUnsignedByte(AbstractExtendedDataInputStream.java:116)
at com.xxdb.io.AbstractExtendedDataInputStream.readBoolean(AbstractExtendedDataInputStream.java:21)
at com.xxdb.streaming.client.MessageParser.run(MessageParser.java:68)
at java.lang.Thread.run(Thread.java:748)

A5: 多线程共用一个 session,会导致 buffer 序列化失败,进而导致此报错。