你的位置:首页 > Java教程

[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()\n” + “=A1.select(OrderDate>=date(\”2010-01-01\”) && OrderDate<=date(\”2010-12-31\”))”);

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

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

       st= (com. esproc.jdbc.InternalCStatement)con.prepareStatement(“=file(\”D:\\sOrder.txt\”).import@t()\n” + “=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调用