左 斌
(重庆市彭水县气象局,重庆 彭水 409600)
基于 Java调用WebService的应用实例
左 斌
(重庆市彭水县气象局,重庆 彭水 409600)
简要介绍了基于 Java就省、市气象局WebService实时数据库接口应用于本地数据库的程序设计。可直接获取适时雨量、温度等气象要素数据,并持久化到本地数据库。该技术现已在彭水县气象信息系统 (互联网 http:// 219.153.254.73/qx和 http://219.153.254.73/qx/psqxj.jsp)上成功实现。
Java;数据库;接口;多线程
省、市气象局实时和历史数据库检索接口的建立,为各区(县)局通过实时数据库检索接口获取本区(县)自动站和区域自动站实时数据,实现实时数据本地化,构建区 (县)级气象信息平台,更好地为地方各级政府、部门、乡镇提供实时的气象数据服务(图 1),是深化决策、安全气象服务的重要内容之一。本文就基于 Java平台如何通过实时数据库检索接口定时获取实时数据,实现数据的存储校验作出了详细阐述。
图 1 气象数据服务网络拓扑图
实时数据库检索应用程序既要能够定时通过省、市数据库接口把存储在数据库中有关本地的自动站数据检索出来,定时插入到本地数据库,实现本地数据库与省、市数据库的同步和一致,又要考虑到可能出现的数据传输等故障,出现数据漏传的情况,具备定时校验本地数据库数据完整性功能,定时将漏传的数据检验出来,补传到本地数据库。实时数据库接口应用程序存取的数据应具有可用性 (Availability)、完整性 (Integrity)、真实性 (Authenticity)特点。
以获取重庆自动站实时地面气象要素资料 (Z_ O_AWS_ST_C5_CQ)〔1〕中彭水站点的数据为例,可设计出与之相对应的本地数据库中的站表“pengshui”(表 1)。
以MySQL数据库为例,创建数据库和表的顺序为:首先,进入MySQL Command Line Client命令行,创建好本地库“info”;然后,按站点建表,创建各自动站的表(具体代码略)。
数据库连接技术—JDBC(Java Database Connectivity)是用于执行语句的应用程序编程接口 API。JDBC能为开发者提供标准的数据库访问类和接口,能够方便地向任何异构数据库发送 SQL语句,同时JDBC是一个支持基本 SQL查询功能的低层应用程序接口,能在不同的数据库功能的层次上提供一个统一的用户界面,同时支持高层的数据库访问工具及API。
第一步是装载 JDBC驱动程序。通常采用的是调用方法 Class.for Name显式地加载驱动程序类,格式为:
Class.for Name
(“companyName.databaseName.DriverName”);
第二步是与数据库建立连接,采用的标准方式是调用 Drive rManager.getConnection方法,下列代码是一般的做法:
Connection conn=Drive rManager.getConnection (url,“Login”,“Pass word");
式中 url为统一资源定位器,代表要进行连接的数据库。“Login”和“Password”替换为实际登录的DBMS的用户名和口令。若连接成功,则返回一个 Connection类的对象 conn。
连接一旦建立,下一步就可向所涉及的数据库传送 SQL语句。JDBC提供了 Statement、Prepared-Statement、CallableStatement三个类,用于向数据库发送 SQL语句。其中 Statement对象用于发送不带参数的简单的 SQL语句;PreparedStatement对象用于发送带或不带输入参数的 SQL语句;CallableS-tatement对象用于执行 SQL储存程序的调用。由方法 createStatement建立名为 stmt的 Statement对象的格式为:
Statement stmt=conn.createStatement();
需要指出的是,stmt不包含传送给 DBMS的 SQL语句,需要提供执行 stmt的方法。Statement接口提供了三种执行 SQL语句的方法:executeQuery、executeUpdate和 execute。方法 executeQuery用于产生单个结果集;方法 executeUpdate用于执行 INSERT、UPDATE或DELETE语句;方法 execute用于执行返回多个结果集。下面给出采用 execQuery方法的语句格式:
ResultSet rs= stmt.executeQuery("SQL语句");
executeQuery的参数是一个查询语句,它的返回值保存在 ResultSet类对象 rs中〔2〕。
表 1 pengshui自动站表
为了方便主程序调用数据库连接等操作,通常把对数据库的各种操作,采用请求转发的原理设计封装成一个数据库连接基类 (DB.java),由数据库连接基类来封装基于 JDBC的连接数据库 (代码略)。
多线程是 Java的一个重要特点,这使得在一个Java程序内部可同时进行多种运算,从而充分利用系统资源,提高程序运行效率。多线程程序可提高系统的输入/输出速度、有效利用系统资源、改善计算机通讯功能等优点。
程序运用 Java多线程实现县局自动站数据、区域自动站数据的定时获取和数据存储校验及其定时补传功能。实现数据从市局数据库接口每小时定时读取的思路是,启用一个线程,用 Calendar类(日历类)的 getInstance()方法得到一个时间点,判断它是否为指定的上传时间。true,则执行 getdatatoarray方法获得本站现在的气象要素数据并添加到本地数据库,执行完毕后,让线程休眠较长时间段(58min);false,则让线程休眠较短的时间段 (58s),再执行以上判断,并把这个 if语句置于一个 while (true)语句内反复运行来实现不间断的自动获取每小时实时数据。实现数据补传的思路是,启用第二个线程,编写一个从 0到 23的循环,用 dataCheck ()检索本地数据库中是否正确插入昨日逐小时的数据,如果没有数据,则补传。
构建好数据库,写好数据库连接基类后,接着应设计站点实体类,就站点对象抽象出来的 rainfallhour、airtemp、relhumidity等属性,分别写出 set和 get方法,并在这个类中封装数据存储和数据校验等方法。部份核心代码如下:
主程序采用 MySQL作为数据库服务器,Net-Beans作为编程工具和设计工具,在程序编写前,需要建立一个 Web Service Client,并对 WSDL URL、Client Style等参数进行配置[3]。
图 2 主程序控制流程图
根据多线程的设计方案和从市局数据库接口每小时定时读取的思路,可设计出本数据库接口应用实例的主程序 (main.java)。部份核心代码如下:
该实时数据库接口应用实例在设计时从整体考虑,建立了严格的完整性规则和科学数据库结构,将定时检索省(市)级数据库接口、存储过程、数据完整性校验应用到程序设计中,加大了后台的功能和效率,对数据库的安全、自动化定时存取做了充分的考虑,提高了气象数据本地化应用水平。该实时数据库接口应用程序设计为本地气象信息系统的开发打下了良好的基础,只要结合前台开发工具和平台,就能实现系统的强大功能。
[1] 实时和历史数据库检索接口应用方法—应用文档说明 .
[2] 赵景林 .利用 JDBC访问面向 Internet的数据库[J].微机发展,2001,11(5):33-35.
TP311
B
2010-09-10
左斌(1973-),男,工程师,主要从事信息网络管理工作。
1003-6598(2010)增刊 -0183-04