内存计算指数据事先存储于内存,各步骤中间结果不落硬盘的计算方式,适合性能要求较高,并发较大的情况。
HANA、TimesTen等内存数据库可实现内存计算,但这类产品价格昂贵结构复杂实施困难,总体拥有成本较高。本文介绍的集算器同样可实现内存计算,而且结构简单实施方便,是一种轻量级内存计算引擎。
下面就来介绍一下集算器实现内存计算的一般过程。
一、 启动服务器
集算器有两种部署方式:独立部署、内嵌部署,区别首先在于启动方式有所不同。
l 独立部署
作为独立服务部署时,集算器与应用系统分别使用不同的JVM,两者可以部署在同一台机器上,也可分别部署。应用系统通常使用集算器驱动(ODBC或JDBC)访问集算服务,也可通过HTTP访问。
n Windows下启动独立服务,执行“安装目录\esProc\bin\esprocs.exe”,然后点击“启动”按钮。
n Linux下应执行“安装目录/esProc/bin/ServerConsole.sh”。
l 内嵌部署
作为内嵌服务部署时,集算器只能与JAVA应用系统集成,两者共享JVM。应用系统通过JDBC访问内嵌的集算服务,无需特意启动。
二、 加载数据
加载数据是指通过集算器脚本,将数据库、日志、WebService等外部数据读入内存的过程。
比如Oracle中订单表如下:
订单明细如下:
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里进行如下配置:
对于独立部署的集算服务器,JAVA应用系统同样要用JDBC接口执行集算器脚本,用法与内嵌服务类似。区别在于脚本存放于远端,所以需要像下面这样指定服务器地址和端口:
如果应用系统非JAVA架构,则应当使用ODBC执行集算器脚本,详见http://doc.raqsoft.com.cn/esp...
对于独立部署的服务器,也可以脱离应用程序,在命令行手工执行initData.dfx。这种情况下需要再写一个脚本(如runOnServer.dfx):
然后在命令行用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)
为方便调试和维护,也可以分步骤编写:
A1:按客户ID过滤数据。其中,“订单”就是加载数据时定义的全局变量,pCustID是外部参数,用于指定需要统计的客户ID,函数select执行查询。@m表示并行计算,可显著提高性能。
A2:执行分组汇总,输出计算结果。集算器默认返回有表达式的最后