zoukankan      html  css  js  c++  java
  • 集算器用作Java计算类库的应用结构

    集算器封装了丰富的结构化文件计算函数,可读入格式复杂的文本,进行结构化文件计算,实现大文件游标计算,简化多线程并行计算。JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果。

    集算器与Java应用程序的集成结构如下:

    下面举例说明Java集成集算器的一般方法。

    文件sOrder.txt是tab分隔的文本文件,存储着一批订单信息。要求用JAVA对该文件进行条件查询,返回指定时间段内的订单。

    sOrder.txt部分数据如下:

    步骤一:在集算器IDE中完成算法

    A1:读入文件。默认分隔符是tab,@t表示将第一行读为列头。

    A2:执行条件查询。startDate和endDate是来自JAVA的参数,比如2010-01-01至2010-12-31。

    步骤二:在集算器IDE中查看计算结果

    点击A2可验证计算结果:

    步骤三:在JAVA中集成集算器脚本
    JAVA主程序可以JDBC的方式调用集算器脚本,代码如下:

           Class.forName(“com.esproc.jdbc.InternalDriver”);

           con= DriverManager.getConnection(“jdbc:esproc:local://”);

           //调用集算器脚本(类似存储过程),其中orderQuery是dfx的文件名

           st =(com. esproc.jdbc.InternalCStatement)con.prepareCall(“call orderQuery (?,?)”);

           st.setObject(1,”2010-01-01″);

           st.setObject(2,”2010-12-31″);

           //执行脚本

           st.execute();

           //获取结果集

           ResultSet rs = st.getResultSet();

           ……

    集算器默认返回最后一个单元格,也可用return语句返回指定单元格。返回值是符合JDBC标准的ResultSet对象,调用集算器脚本和访问数据库的方法完全一样,熟悉JDBC的程序员可以很快掌握。

    上面的例子说明了JAVA集成集算器的一般方法,下面说明几种特殊情况。

    简单脚本无文件

    集算器脚本比较简单时,可以将脚本直接写在JAVA中,而不必专门存储一个脚本文件。比如前面的例子可以写作:

           st = (com. esproc.jdbc.InternalCStatement)con.createStatement();

           ResultSet rs1 = st.executeQuery(“=file(”D:\sOrder.txt”).import@t() ” + “=A1.select(OrderDate>=date(”2010-01-01”) && OrderDate<=date(”2010-12-31”))”);

    可以看到,行和行之间只需用回车“ “来分隔(列之间用 分隔)。

    也可以使用prepareStatement对象执行脚本,以便进行参数类型强制转换。prepareStatement里的参数占位符在SQL中是问号,但问号是集算器的保留符号,因此要用”arg1,arg2,arg3”的形式依次占位,代码如下:

           st= (com. esproc.jdbc.InternalCStatement)con.prepareStatement(“=file(”D:\sOrder.txt”).import@t() ” + “=A1.select(OrderDate>=arg1 && OrderDate<=arg2)”);

           java.util.Date  dateBegin  =  new SimpleDateFormat(“yyyy-MM-dd”).parse(“2010-01-01″);    

           java.sql.Date  sqlDateBegin  =  new java.sql.Date(dateBegin.getTime());

           java.util.Date  dateEnd  =  new SimpleDateFormat(“yyyy-MM-dd”).parse(“2010-12-31″);    

           java.sql.Date  sqlDateEnd  =  new java.sql.Date(dateEnd  .getTime());

           st.setDate(1, sqlDateBegin); 

           st.setDate(2, sqlDateEnd ); 

    ResultSet rs1 = st.executeQuery(); 

    大返回值

    有时候计算结果会超出内存,这时就要用集算器游标函数返回结果,相应的JAVA要使用JDBC流来访问。比如:按时间段查询大文件sOrderBig.txt,集算器代码如下:

    函数cursor以游标方式打开大文件,函数select的查询结果也是游标。

    JAVA集成集算器的代码如下:

           st =(com. esproc.jdbc.InternalCStatement)con.prepareCall(“call orderBigQuery (?,?)”);

           st.setObject(1,”2010-01-01″);

           st.setObject(2,”2010-12-31″);

           st.setFetchSize(1000);//设置每批次读取的记录数。

           st.execute();

           ResultSet rs = st.getResultSet();

           while (rs.next()) {

           ……

           }

    涉及数据库
    如果计算时涉及数据库,可在集算器中完成计算,并用集算器JDBC统一返回,而不必在JAVA中单独集成数据库。比如下面的代码可将数据库表emp对齐到sOrder.txt中。

    关于在集算器中访问数据库请参考集算器辅助SQL编写的应用结构,JAVA集成集算器请参考集算器集成应用之被JAVA调用

  • 相关阅读:
    【LOJ#10027】魔板
    【LOJ#2653】山峰和山谷
    【POJ2449】第k短路
    【HAOI2008】移动玩具
    【洛谷P1379】八数码难题
    【NOIP2002】字串变换
    【CH2501】矩阵距离
    【CH2601】电路维修
    【NOIP2009】靶形数独
    树的子结构
  • 原文地址:https://www.cnblogs.com/raqsoft/p/5011996.html
Copyright © 2011-2022 走看看