基于 MySQL 的 Worklight 数据储存

在实际的工作中,开发人员需要根据用户的访问特点来调整应用。通过记录用户访问的手机类型、访问时间和调用的功能,能够为开发人员和系统维护人员提供必要的数据指导应用的维护,所以 Worklight 提供了后台的数据库支持。文章将首先介绍数据库的安装和导入;然后介绍 Worklight 的数据库配置;最后分析表格数据字段的含义,提出生成报表的工具。需要注意的是,本文针对的是 Worklight5.* 的版本,与原有的 4.* 相差较大,请参考时特别注意。

王 骐, 高级工程师, IBM

王骐是 IBM GPS 部门的一名工程师。他是 AdviseHR mobile 开发团队的成员之一,致力于企业级手机服务的研究,目前主要从事基于混合模式的移动程序开发。



2013 年 4 月 25 日

数据库的作用

对于手机应用的开发者而言,在第一个版本发布之后,还需要维护应用,并且推出后续的版本。根据用户使用的手机类型、具体功能的使用频率和功能操作的时间分布,可以为开发者推出升级版本提供良好的数据支持。Worklight 服务器作为一个完整的移动程序的开发平台和应用平台,提供了从数据库配置,到数据采集,到最终报表生成等一系列的功能支持。为了更好的让开发者和维护者使用这些功能,本文将从数据库配置入手,然后介绍日常数据采集的需求和 Worklight 数据库表格结构中支持的采集样式,最后通过实际的示例演示具体的效果。


数据库的安装和导入

Worklight 目前支持的数据库类型一共有四种,分别是 derby、MySQL、DB2 和 Oracle;本文将通过 MySQL 作为后台数据库,完成相应的安装、配置和调试工作,然后解释数据表中各个数据的详细含义,让手机应用的开发者可以在自己开发的手机应用中,完成基于 MySQL 的 Worklight 数据储存功能。

MySQL 数据库的安装很简单,示例中使用 MySQL5.0 版本,同时需要下载的是基于 Java 的 MySQL Connector,这样就可以通过其中包含的 jar 文件来连接后台的数据库。启动数据库后根据清单 1 提供的命令行创建需要的数据库实例和用户:

清单 1. 数据库创建命令行
 CREATE DATABASE WRKLGHT CHARACTER SET utf8 COLLATE utf8_general_ci; 
 GRANT ALL privileges ON WRKLGHT.* TO 'worklight'@'Worklight-host'
 IDENTIFIED BY 'worklight'; 
 GRANT ALL privileges ON WRKLGHT.* TO 'worklight'@'localhost'
 IDENTIFIED BY 'worklight'; 
 Flush privileges; 

 CREATE DATABASE WLREPORT CHARACTER SET utf8 COLLATE utf8_general_ci; 
 GRANT ALL privileges ON WLREPORT.* TO 'worklight'@'Worklight-host'
 IDENTIFIED BY 'worklight'; 
 GRANT ALL privileges ON WLREPORT.* TO 'worklight'@'localhost'
 IDENTIFIED BY 'worklight'; 
 Flush privileges;

命令行需要说明的有两点

  • 数据库实例一共有两个,分别是 WRKLGHT 和 WLREPORT;用于记录系统的数据和应用的数据。因为历史的原因,其中的一些数据表已经被废弃,但是没有及时删除,所以这些表是永远不会有数据的。
  • 在创建用户时,Worklight-host 将被安装机器的真实 IP 所替换,这样系统就创建了两个用户,一个用于让本地的服务器访问;一个用于让远程的服务器访问。

数据库安装完毕后,需要导入相应的数据表文件。在 Worklight 的服务器上有两个 SQL 文件,分别是 create-worklight-mysql.sql 和 create-worklightreports-mysql.sql,在数据库工具中将它们分别导入到第一和第二个数据库就完成了数据库表的创建(开发者可以使用自己熟悉的客户端工具进行表结构的导入)。


Worklight 的配置

在默认的情况下,数据采集的功能是关闭的,需要服务器配置人员根据自己需要安装和配置相应的数据库,从而来获取所需要的数据。在基于 Eclipse 的测试环境中,服务器配置是和具体应用绑定的,所以为了配置服务器信息,需要按照常规流程创建一个基于混合模式的手机应用,在项目的 server 文件夹下,有一个 lib 目录,将 Java Connector 中的 mysql-connector-java.jar 导入到这个目录;然后修改 conf 目录下的 worklight.properties 文件,通过在这里配置属性,完成数据的记录工作。为了记录数据首先需要修改的配置项如清单 2 所示:

 reports.exportRawData=true

这是 Worklight 数据库采集数据的开关,在很多情况下,虽然数据库的连接池、用户名和密码都配置正确,却没有数据的原因就是该配置没有修改。然后根据数据库的类型配置相应的信息。在本例中,将按照清单 3 进行配置:

清单 3. 记录数据配置
 wl.db.type=MYSQL 
 wl.db.url=jdbc:mysql://localhost:3306/WRKLGHT 
 wl.db.username=worklight 
 wl.db.password=worklight 

 wl.reports.db.type=MYSQL 
 wl.reports.db.url=jdbc:mysql://localhost:3306/WLREPORT 
 wl.reports.db.username=worklight 
 wl.reports.db.password=worklight

最后需要在 MySQL 的配置文件中设置一个参数,如清单 4 所示,否则启动 Worklight 会报错:

清单 4. MySQL 配置
 max_allowed_packet=16M

从清单 3 中可以发现配置存在一个问题,就是数据库的密码以明文的形式存在,为了保证用户数据库的安全,Worklight 提供了批处理文件用于对配置文件进行加密。在服务器的安装目录中,有一个 encrypt.bat 文件,通过调用它可以加密需要的 properties,然后相应的密码会以密文的形式存在于配置文件中,增加了数据库配置的安全性。

客户端代码

完成数据库的配置后,将应用部署到测试服务器,并且通过浏览器访问应用,然后查看数据库。在 WRKLGHT 的数据表中已经存入了下列数据:Worklight 的版本、部署的应用信息和版本信息、适配器的信息等等。但是在 WLREPORT 中却没有任何的数据。

问题出在何处呢?分析 Worklight 数据库记录的机制,在应用部署到服务器的时候,系统可以根据部署的应用信息,来记录相应的数据。但是为了记录用户的使用信息,一定是在用户调用应用的时候才记录信息。这就说明在应用中还有地方在管理是否连接数据库,需要修改其中的代码,才能记录用户的操作信息。根据开发手册的提示,应用在启动时是否连接服务器由 connectOnStartup 参数控制,打开 initOptions.js 发现相应的参数是 false,如清单 5 所示:

清单 5. 初始化 JavaScript 文件
 var wlInitOptions = { 
    connectOnStartup : false 
 };

这里需要指出的是,在原先的 Worklight 版本中,包括 5.0.2 以及之前的版本,这个参数都是默认为 true 的,这说明在 Worklight5.0.5 的版本中,各种设定和原有的版本可能不同,从而引起使用原有版本开发者的困惑。

在修改了相应的参数后,重新部署应用,并且利用浏览器或者模拟器进行访问,在 WLREPORT 数据库中就有了记录的数据。


表结构介绍和示例

在一般应用中下列数据经常需要被记录在数据库中:

  • 登录用户信息:指定用户的登录情况,是记录的常规数据,通过这项记录可以分析用户的活跃程度和登录时间。
  • 移动设备信息:在现实环境中,不同人群使用移动设备是有群体性的,也就是说不同客户群体趋向于使用某种类型的移动设备。通过这些信息,可以在下个版本推出时,加强应用在相应设备的支持。
  • 应用版本信息:为了兼容不同的用户,在服务器上可能维持着多个版本。通过监听访问的版本信息,维护者和开发者可以知晓目前最流行的版本。然后在相应的版本上做修正,提高版本的性能。同时,对于快要废弃的版本,可以根据访问的情况,决定废弃的时间。
  • 手机序列号:序列号可以唯一标示访问的手机,用于客户和手机信息的绑定。
  • 函数调用信息:用户调用的函数信息,包括用户使用的适配器和其中的方法。这些信息对于分析系统的问题和客户关心的功能很有作用。最终,为开发者开发新的版本提供依据。
  • 不定信息:在不同应用中总有一些特殊的信息需要记录,在数据库中如何灵活的记录和读取这些信息,是考察数据库设计的一个重要标准。

对比以上的要求,分析 Worklight 报表数据库中,最关键的 app_activity_report 表,在表格 1 中列出表中的字段并作相应的解释:

表 1. 表格说明
字段 说明
ID 用于标识每条记录,便于数据库的记录查询
ACTIVITY 用于记录各种从客户端传来的事件,比如默认的初始化、登录事件;或者用户定义的操作开始、结束事件
ACTIVITY_TIMESTAMP 事件发生的时间点,精确到秒
ADAPTER 用户操作调用的适配器名称,在 Worklight 中还存在适配器调用适配器的情况,这些将不被记录在数据库中
DEVICE_ID 移动设备的 ID,这个数据并不是手机上存在的序列号,而是根据 cordova 中的函数获得的内容
DEVICE_MODEL 移动设备的类型,硬件生产厂商在手机中注入的手机品牌信息
DEVICE_OS 移动设备上安装的操作系统版本,比如 2.2,5.0 等等
ENVIRONMENT 系统访问 Worklight 的对应环境,也揭示了手机的操作系统,比如 iOS,Android
GADGET_NAME 访问的应用名称
GADGET_VERSION 访问的应用版本
IP_ADDRESS 用户手机端的 IP 地址
PROC 用户调用的函数,这个需要和被调用的适配器相关联
SESSION_ID Worklight 维护的 session ID,用于标识用户的登录信息
SOURCE 用户标示,根据登录用户的信息,确定用户唯一的 ID。它和 SESSION_ID 的不同在于,任何一次登录,这个数据是不变的
USER_AGENT 用户访问时使用的浏览器

将数据库字段与实际需要的数据进行对比,表中的很多字段已经支持了相应的需求:用户登录信息可以通过 SOUCE 和 USER_AGENT 来确认;移动设备信息可以通过设备的类型和设备的操作系统确认;应用版本信息可以通过应用名称和应用版本字段确认;手机序列号通过设备 ID 确认;函数调用信息通过适配器字段和函数字段确认;最后不定信息,也就是最灵活的信息,需要通过构建结构化事件字段信息来确认。 在 Worklight 预设的事件中,一共包括六个事件:

  • init:初始化事件;在用户调用基于 Worklight 的应用时,客户端会向服务器发送一个初始化的指令,也就是调用了 WL.Client.init 客户端函数后,触发的一个初始化过程。
  • Login:登录事件;在 5.0 之后的 Worklight 中,不管用户是否登录,系统都会自动维护一个 session,这样就会启动一个登录事件。
  • Adoption:用途不明,并且在 5.0 中不支持。
  • Adoption New:同 Adoption。
  • Query:查询事件;在客户端调用所有的适配器时,都会驱动这样的事件,并且在相应的字段中记录调用的适配器名称和实际的方法。
  • Logout:注销事件;当客户端调用 WL.Client.logout 函数或者 session 过期时,系统就会触发一个注销事件。

在系统支持的所有默认事件上,将基础的记录功能已经覆盖了,但是当用户需要定义自己的事件时应该如何操作呢?比如,用户可能希望对于一些关键的操作进行记录(一笔业务的开始、业务的结束和业务的详细信息),这时就需要调用系统支持的客户端函数 WL.Client.logActivity 来写入特殊的字符串,用于记录开发者需求的信息。

示例演示

为了更好地说明上面的情况,本文余下的内容将构建一个用户访问重要内容数据的例子,将数据库记录的结果演示给读者,从而完成数据库记录工作的具体描述。

将新创建的工程按照数据库配置的方法进行调试,完成数据库的配置工作。然后建立一个简单的 HTTP 适配器,在适配器中构建一个 JSON 数据,作为函数返回值返回给客户端(返回的数据必须是对象,否则调用适配器出错)。

在客户端代码中,创建调用适配器的函数,关键的代码如清单 6 所示:

清单 6. 日记记录代码
 function openKey() { 
    WL.Client.logActivity('start open key'); 
    var invocationData = { 
        adapter : 'KeyAdpater', 
        procedure : 'getKeyContent', 
        parameters : [] 
    }; 

    WL.Client.invokeProcedure(invocationData, { 
        onSuccess : openKeySuccess, 
        onFailure : openKeyFailure 
    }); 
 } 

 function openKeySuccess(data) { 
	 WL.Client.logActivity('success open key'); 
 } 

 function openKeyFailure(data) { 
    WL.Client.logActivity('fail open key'); 
 }

代码的流程如下:在调用适配器之前,记录调用开始的信息;然后调用适配器方法,获得数据;当调用结束后,无论返回的是成功或是失败,均记录调用的结果。这样在数据库中就会记录调用开始的事件、调用函数的事件,和调用结果的事件。部署相应的适配器和应用,然后开启浏览器和 Android 的模拟器访问相同的应用。取得的结果如表格 2 所示:

表 2. 不同环境测试结果
字段 浏览器 Android 模拟器
DEVICE_ID NULL b3c35b9d-6bd7-4617-bc43-a6310f4b85e8
DEVICE_MODEL NULL sdk
DEVICE_OS NULL 2.2
ENVIRONMENT common android
SESSION_ID hjz254x221kmlprese9iqslo 1q5pmxbbjt1so1755gmpdwxrjc
SOURCE e27cf5ff-d0cd-4910-928e-55c36d3a0848 503df7a9-a0df-4429-b63d-45bb12c4ca6d

从表中可以看到,在模拟器环境下,数据库会记录手机的操作系统信息,但是浏览器不会;同时两者访问的代码环境不同,session 和 source 都说明两者来自于不同的访问端。

然后观察记录不同事件的字段,如表 3 所示:

表 3. 不同环境测试结果
字段 默认事件 自定义事件
ACTIVITY query start open key, success open key
ADAPTER KeyAdapter NULL
PROC getKeyContent NULL

从表中可以看到,当调用适配器时,系统会使用默认的 query 事件作为 Activity 字段的值,并且记录调用的适配器和其中的方法,但是调用自定义事件时,系统就将开发者定义的字段记录到 Activity 中,其余属性为 NULL。

更进一步的研究 ACTIVITY 字段发现,该字段的长度为 4000,所以开发者可以利用这个长度记录格式化 LOG 信息,并且通过解析的方式,获得各种有用的数据。详细的内容,读者可以下载本文实例,部署到 Eclipse 环境中进行测试。


报表生成工具

在记录了报表数据之后,需要利用报表工具将数据导出,便于维护人员查看。在 Worklight 平台提供了两套机制用于数据的管理:一、使用 OLAP 直接从数据表中读取数据,然后分析;二、利用 Worklight 提供的工具,每二十四小时采集数据表中的数据,填入设备使用表(WLREPORT 中的另一张表),用于报表的生成。在众多的报表生成工具中,商业智能报表工具(BIRT)是一个生成和展现报表的良好选择,通过它可以方便用户利用 Eclipse 插件进行报表的设计和查看;同时还能将生成的报表模板安装在服务器,通过网页的形式浏览。在 IBM 的官方网站上,已经定义了不少基于 XML 格式的报表模板,用户可以下载使用,并且学习利用 BIRT 定义自己需要的报表模板。


结束语

开发良好的应用是一个长期的过程,根据用户的使用情况和使用偏好来更新应用的版本是良好的维护方式。基于数据库记录的数据,维护者和开发者都可以获取详细的信息,作为改良应用的指南。本文从配置数据库连接开始,介绍了基于 Worklight 的数据库连接、安全设定以及数据记录格式和方式,为开发者开发更好的应用提供了有益的方法,也为维护者分析已经部署的应用提供了帮助。在完成了数据库的数据收集后,可以通过报表工具来完成数据的导出和呈现,这不但有利于维护人员的查看,也有利于展现给管理人员,说明应用的使用情况。


下载

描述名字大小
样例应用程序SQLDemo.zip4 MB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, 移动开发
ArticleID=877610
ArticleTitle=基于 MySQL 的 Worklight 数据储存
publish-date=04252013