加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

集算器集成与应用之被JAVA调用(1)

(2014-12-31 11:08:20)
标签:

it

集算器

集成

java调用

分类: 应用与集成

可以将集算器嵌入到Java应用程序中。使用时类似于用JDBC访问数据库的方式调用集算器网格程序。在过程中,网格程序被包装成存储过程,因此调用方法与调用存储过程相同。

1、基本使用

1.1、集算器JDBCjar包说明

集算器JDBC类似一个不带物理表的数据库JDBC驱动,可以把它简单的看成是一个只有存储过程的数据库。另外,集算器JDBC是个完全嵌入式计算引擎,已经在JDBC中完成了所有运算,不象数据库那样JDBC只是个接口,实际运算在独立的数据库服务器完成。

集算器JDBC包含五个基础jar包,都位于[安装目录]\esProc\ lib目录下:

       dm.jar                                          集算器计算引擎及JDBC驱动包

       poi-3.7-20101029.jar                                       处理对Excel文件的读写

       log4j_128.jar                                处理日志

       icu4j_3_4_5.jar                             处理国际化

       dom4j-1.6.1.jar                             解析配置文件

如果在集算器JDBC需要其它数据库作为集算器中的数据源,那么还需要相应数据库的驱动jar包,特别的,使用demo数据库需要hsqldb.jar。如果在集算器JDBC中需要使用绘制图形功能,还需要SVG类型图象处理相关的3jar包,包括xml-apis-ext.jarbatik-1.7.jarbatik-ext.jar。需要注意的是,集算器JDBC需要JDK1.6或更高版本。

1.2、集算器JDBC使用的网格文件

与用call函数跨网格调用时类似,在集算器JDBC中使用的网格代码中,结果集需要通过result语句返回。如下面的网格文件createTable1.dfx

http://s12/mw690/004bRgNGzy6OOcP9Wjx8b&690

这个网格中的计算比较简单:生成一个100条记录的序表,包含顺序设定的ID字段与随机生成的Amount字段。在A3中,用result语句将A1中的序表返回。

下面我们将使用这个网格文件,熟悉在JAVA中调用集算器JDBC的方法。

1.3、用JAVA调用的基本方法

在调用集算器执行网格文件前,首先需要按下面步骤配置相关的信息:

1)        加载需要用到的jar包。在启动JAVA应用程序时加载前面提到的dm.jarjar包,如果在web应用下,可以把这些jar包放在WEB-INF/lib目录下

2)        部署dfxConfig.xmlconfig.xml

config.xml中包含了集算器的基本配置信息,如注册码、寻址路径、主目录、数据源配置等,它可以在集算器的[安装目录]\esProc\config路径下找到,其中存储的信息与集算器的选项页面中设定相同。在部署时可以先调整其中的配置。

dfxConfig.xml中可以配置集算器的并发数等信息,日志文件信息以及连接池信息。它可以在集算器的[安装目录]\esProc\classes路径下找到

注意:配置文件需复制后放置在应用项目的类路径下,但名称必须为dfxConfig.xmlconfig.xml,不能改变。关于这两个文件的具体解释,可以参考 集算器集成应用之JDBC部署

3)        部署dfx文件

将上面的createTable1.dfx放到应用项目的类路径下,也可以放到config.xml文件的节点指定的寻址路径,或者指定的主路径中。

4)        JAVA中调用dfx

public void testDataServer(){

           Connection con = null;

           com.esproc.jdbc.InternalCStatement st;

           try{

                    //建立连接

                    Class.forName("com.esproc.jdbc.InternalDriver");

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

                    //调用存储过程,其中createTable1dfx的文件名

                    st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call createTable1()");

                    //执行存储过程

                    st.execute();

                    //获取结果集

                    ResultSet rs = st.getResultSet();

                   

                    //简单处理结果集,将结果集中的字段名与数据输出

                    ResultSetMetaData rsmd = rs.getMetaData();

                    int colCount = rsmd.getColumnCount();

                    for ( int c = 1; c <= colCount;c++) {

                             String title = rsmd.getColumnName(c);

                             if ( c > 1 ) {

                                       System.out.print("\t");

                             }

                             else {

                                       System.out.print("\n");

                             }

                             System.out.print(title);

                    }

                    while (rs.next()) {

                             for (int c = 1; c<= colCount; c++) {

                                       if ( c > 1 ) {

                                                System.out.print("\t");

                                       }

                                       else {

                                                System.out.print("\n");

                                       }

                                       Object o = rs.getObject(c);

                                       System.out.print(o.toString());

                             }

                    }

           }

           catch(Exception e){

                  System.out.println(e);

         }

         finally{

                    //关闭连接

                   if (con!=null) {

                             try {

                                       con.close();

                             }

                             catch(Exception e) {

                                       System.out.println(e);

                             }

                    }

           }

}

在调用集算器文件时,用"call createTable1()"语句,即可运行网格文件createTable1.dfx并将结果返回为ResultSet对象。在后续的程序中,简单将结果集中的数据输出。程序运行后,输出结果如下:


http://s5/mw690/004bRgNGzy6OOcPERiA44&690

2、调用不同的网格文件

1.3JAVA调用的基本方法中,我们了解了如何在JAVA程序中调用一个网格文件。在这里我们详细了解一下如何调用不同的网格文件。先来看下面的网格文件createTable2.dfx


http://s6/mw690/004bRgNGzy6OOcQc7Z3c5&690

在这个网格文件中,需要从数据源demo中获取数据,同时使用了日期类型的参数Date


http://s12/mw690/004bRgNGzy6OOcQ8nj5fb&690

在网格中使用的demo数据源,需要在config.xml文件中配置,具体方法可以参考 集算器集成与应用之JDBC部署。在网格中创建的数据源连接,在使用后应该用db.close() 函数关闭。

JAVA中调用时,建立连接、输出结果等部分的代码是完全相同的,调用文件部分如下:

                    //调用存储过程,其中createTable2dfx的文件名,?代表使用的参数

                    st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call createTable2(?)");

                    //设置参数

                    java.util.Calendar calendar = java.util.Calendar.getInstance();

                    calendar.set(1980, 0, 1);

                    st.setObject(1, calendar.getTime());

                    //执行存储过程

                    st.execute();

                    //获取结果集

                    ResultSet rs = st.getResultSet();

这个网格文件包含一个参数,因此调用时使用"call createTable2(?)",其中的 ? 代表需要输入的参数。在这种情况下需要用st.setObject() 方法输入参数。输入参数时,将按次序设入参数,而与网格中参数的名称无关。网格文件将根据输入的日期列出生日与之在同一天的员工,需要注意的是在Calendar类中设置日期时,月份是从0开始的。结果集输出如下:


http://s1/mw690/004bRgNGzy6OOcQwiEo50&690

在输入参数时,除了直接按照类型输入参数对象,日期类型的参数也可以输入字符串,由集算器自动解析:

                    //设置参数

                    st.setObject(1, "1/1/1980");

注意输入字符串需要符合config.xml文件中设置的日期格式。程序运行的结果和上面是相同的。

 

除了上面的调用方法,还可以把参数写定在语句中,如:

                    //调用存储过程,其中createTable2dfx的文件名,在语句中写定参数

                    st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call createTable2(\"2/29/1980\")");

                    //执行存储过程

                    st.execute();

                    //获取结果集

                    ResultSet rs = st.getResultSet();

使用这样的调用方法时,不能根据参数类型输入对象,而只能使用数值型参数,或使用字符串型参数交由集算器解析。计算后,结果如下:


http://s5/mw690/004bRgNGzy6OOcQoJ6Id4&690

由于没有找到229日出生的员工,因此在网格的B5格中用result语句返回了字符串None。从上面的结果中我们可以发现,即使从网格返回的数据是单值,也会自动生成结果集中的列名,作为标准Result返回。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有