java全量数据加载到内存中_轻量级内存计算引擎

本文介绍了如何使用集算器实现内存计算,集算器作为轻量级内存计算引擎,能高效处理数据。文章详细讲解了数据加载、内存计算过程、业务算法编写以及数据更新的策略,展示了如何通过集算器脚本将数据从Oracle数据库加载到内存,执行计算任务,并在需要时更新内存中的数据。集算器支持多种数据源,简化了内存计算的实现和维护。
摘要由CSDN通过智能技术生成

内存计算指数据事先存储于内存,各步骤中间结果不落硬盘的计算方式,适合性能要求较高,并发较大的情况。

HANA、TimesTen等内存数据库可实现内存计算,但这类产品价格昂贵结构复杂实施困难,总体拥有成本较高。本文介绍的集算器同样可实现内存计算,而且结构简单实施方便,是一种轻量级内存计算引擎。

下面就来介绍一下集算器实现内存计算的一般过程。

一、        启动服务器

集算器有两种部署方式:独立部署、内嵌部署,区别首先在于启动方式有所不同。

l   独立部署

作为独立服务部署时,集算器与应用系统分别使用不同的JVM,两者可以部署在同一台机器上,也可分别部署。应用系统通常使用集算器驱动(ODBC或JDBC)访问集算服务,也可通过HTTP访问。

n  Windows下启动独立服务,执行“安装目录\esProc\bin\esprocs.exe”,然后点击“启动”按钮。

af2b8235f616e51714a899ca5fb0b20b.png

n Linux下应执行“安装目录/esProc/bin/ServerConsole.sh”。

l  内嵌部署

作为内嵌服务部署时,集算器只能与JAVA应用系统集成,两者共享JVM。应用系统通过JDBC访问内嵌的集算服务,无需特意启动。

二、        加载数据

加载数据是指通过集算器脚本,将数据库、日志、WebService等外部数据读入内存的过程。

比如Oracle中订单表如下:

2615b631f1bbcf8baa3241a24fa55482.png

订单明细如下:

f16a90da0bf4cf0567d18911bea4b54d.png

A1:连接Oracle数据库。

A2-A3:执行SQL查询,分别取出订单表和订单明细表。query@x表示执行SQL后关闭连接。函数keys可建立主键,如果数据库已定义主键,则无需使用该函数。

A4-A5:将两张表常驻内存,分别命名为订单和订单明细,以便将来在业务计算时引用。函数env的作用是设置/释放全局共享变量,以便在同一个JVM下被其他算法引用,这里将内存表设为全局变量,也就是将全表数据保存在内存中,供其他算法使用,也就实现了内存计算。事实上,对于外存表、文件句柄等资源也可以用这个办法设为全局变量,使变量驻留在内存中。

脚本需要执行才能生效。

对于内嵌部署的集算服务,通常在应用系统启动时执行脚本。如果应用系统是JAVA程序,可以在程序中通过JDBC执行initData.dfx,关键代码如下:

1.      com.esproc.jdbc.InternalConnection con=null;

2.      try {

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

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

5.            ResultSet rs = con.executeQuery("call initData()");

6.       } catch (SQLException e){

7.          out.println(e);

8.       }finally{

9.          if  (con!=null) con.close();

10.   }

如果应用系统是JAVA WebServer,那么需要编写一个Servlet,在Servlet的init方法中通过JDBC执行initData.dfx,同时将该servlet设置为启动类,并在web.xml里进行如下配置:

10264b4a1418ccc7aee360b2d20e4766.png

对于独立部署的集算服务器,JAVA应用系统同样要用JDBC接口执行集算器脚本,用法与内嵌服务类似。区别在于脚本存放于远端,所以需要像下面这样指定服务器地址和端口:

13bdd30933f822df5eeaf7218328ff17.png

如果应用系统非JAVA架构,则应当使用ODBC执行集算器脚本,详见http://doc.raqsoft.com.cn/esp...

对于独立部署的服务器,也可以脱离应用程序,在命令行手工执行initData.dfx。这种情况下需要再写一个脚本(如runOnServer.dfx):

15715bb1aec35827ce3a5ae8eed96cc7.png

然后在命令行用esprocx.exe调用runOnServer.dfx:

D:\raqsoft64\esProc\bin>esprocx runOnServer.dfx

三、        执行运算获得结果

数据加载到内存之后,就可以编写各种算法进行访问,执行计算并获得结果,下面举例说明:以客户ID为参数,统计该客户每年每月的订单数量。

该算法对应的Oracle中的SQL语句如下:

select to_char(订单日期,'yyyy') AS 年份,to_char(订单日期,'MM') AS 月份, count(1) AS 订单数量 from   订单 where客户ID=? group by to_char(订单日期,'yyyy'),to_char(订单日期,'MM')

在集算器中,应当编写如下业务算法(algorithm_1.dfx)

29d57513c2831ba69fb015792359b6f4.png

为方便调试和维护,也可以分步骤编写:

4a4d4397add7eaacf09eb62819db3e05.png

A1:按客户ID过滤数据。其中,“订单”就是加载数据时定义的全局变量,pCustID是外部参数,用于指定需要统计的客户ID,函数select执行查询。@m表示并行计算,可显著提高性能。

A2:执行分组汇总,输出计算结果。集算器默认返回有表达式的最后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值