我对KDB不太好(如果问题听起来很愚蠢)。我正在尝试使用kdb(磁盘不是内存)从数据库加载所有数据。我已经问upserts的问题,我想通了如何从控制台UPSERT并保存到磁盘使用qJava写入KDB
q)dsPricing:([id:`int$(); date:`date$()] open:`float$();close:`float$();high:`float$();low:`float$();volume:`int$())
q)dsPricing:([id:`int$(); date:`date$()] open:`float$();close:`float$();high:`float$();low:`float$();volume:`int$())
q)`dsPricing insert(123;2003.03.23;1.0;3.0;4.0;2.0;1000)
q)`dsPricing insert(123;2003.03.24;1.0;3.0;4.0;2.0;2000)
q)save `:dsPricing
q)`:dsPricing upsert(123;2003.03.25;1.0;3.0;4.0;2.0;1500)
现在我试图做到这一点在Java中,并具有以下代码
public class LoadDS {
SqlSession session;
private DataStreamMapper mapper ;
public static void main(String args[]){
final QConnection q = new QBasicConnection(args.length >= 1 ? args[0] : "localhost", args.length >= 2 ? Integer.parseInt(args[1]) : 5001, "user",
"pwd");
LoadDS l=new LoadDS();
l.session = MyBatisConnectionFactory.getSqlSessionFactory("SMALLS").openSession();
l.mapper = l.session.getMapper(DataStreamMapper.class);
List<DataStream> prices = l.mapper.selectHistoricalPrices(1);
try {
q.open();
q.sync("upsert", "'dsPricing", l.getData(prices));
} catch (QException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// dsPricing:([id:`int$(); date:`date$()] open:`float$();close:`float$();high:`float$();low:`float$();volume:`int$())
private Object[] getData(List<DataStream> prices) {
final Object[] data = new Object[] {new int[prices.size()], new QDate[prices.size()],
new float[prices.size()], new float[prices.size()],
new float[prices.size()],new float[prices.size()],
new int[prices.size()]
};
for (int i = 0; i < prices.size(); i++) {
((int[]) data[0])[i] = prices.get(i).getInfoCode();
((QDate[]) data[1])[i] = new QDate(prices.get(i).getMarketDate());
((float[]) data[2])[i] = (float)prices.get(i).getOpen_();
((float[]) data[3])[i] = (float)prices.get(i).getClose_();
((float[]) data[4])[i] = (float)prices.get(i).getHigh();
((float[]) data[5])[i] = (float)prices.get(i).getLow();
((int[]) data[6])[i] = (int)prices.get(i).getVolume();
}
return data;
}
}
谁能告诉我我做错了什么?数据没有得到保存,我尝试了多种变化。我宁愿只从SQL加载数据并将其保存到磁盘以进行初始加载。
您是否尝试过使用消息处理程序向KDB一旁看到这是怎么回事?在kdb端设置.z.po:{show“connected”},这样你就可以确定你已经连接了。在kdb一侧设置.z.pg:{0N!x}以准确查看您发送的内容 – terrylynch 2014-09-11 12:40:10
您是否确实意指''dsPricing'中的''而不是'\'(很难看到这个字体中的不同,意味着反击与反转!) – 2014-09-16 14:33:18