左 斌
(重慶市彭水縣氣象局,重慶 彭水 409600)
基于 Java調用WebService的應用實例
左 斌
(重慶市彭水縣氣象局,重慶 彭水 409600)
簡要介紹了基于 Java就省、市氣象局WebService實時數據庫接口應用于本地數據庫的程序設計??芍苯荧@取適時雨量、溫度等氣象要素數據,并持久化到本地數據庫。該技術現(xiàn)已在彭水縣氣象信息系統(tǒng) (互聯(lián)網 http:// 219.153.254.73/qx和 http://219.153.254.73/qx/psqxj.jsp)上成功實現(xiàn)。
Java;數據庫;接口;多線程
省、市氣象局實時和歷史數據庫檢索接口的建立,為各區(qū)(縣)局通過實時數據庫檢索接口獲取本區(qū)(縣)自動站和區(qū)域自動站實時數據,實現(xiàn)實時數據本地化,構建區(qū) (縣)級氣象信息平臺,更好地為地方各級政府、部門、鄉(xiāng)鎮(zhèn)提供實時的氣象數據服務(圖 1),是深化決策、安全氣象服務的重要內容之一。本文就基于 Java平臺如何通過實時數據庫檢索接口定時獲取實時數據,實現(xiàn)數據的存儲校驗作出了詳細闡述。
圖 1 氣象數據服務網絡拓撲圖
實時數據庫檢索應用程序既要能夠定時通過省、市數據庫接口把存儲在數據庫中有關本地的自動站數據檢索出來,定時插入到本地數據庫,實現(xiàn)本地數據庫與省、市數據庫的同步和一致,又要考慮到可能出現(xiàn)的數據傳輸等故障,出現(xiàn)數據漏傳的情況,具備定時校驗本地數據庫數據完整性功能,定時將漏傳的數據檢驗出來,補傳到本地數據庫。實時數據庫接口應用程序存取的數據應具有可用性 (Availability)、完整性 (Integrity)、真實性 (Authenticity)特點。
以獲取重慶自動站實時地面氣象要素資料 (Z_ O_AWS_ST_C5_CQ)〔1〕中彭水站點的數據為例,可設計出與之相對應的本地數據庫中的站表“pengshui”(表 1)。
以MySQL數據庫為例,創(chuàng)建數據庫和表的順序為:首先,進入MySQL Command Line Client命令行,創(chuàng)建好本地庫“info”;然后,按站點建表,創(chuàng)建各自動站的表(具體代碼略)。
數據庫連接技術—JDBC(Java Database Connectivity)是用于執(zhí)行語句的應用程序編程接口 API。JDBC能為開發(fā)者提供標準的數據庫訪問類和接口,能夠方便地向任何異構數據庫發(fā)送 SQL語句,同時JDBC是一個支持基本 SQL查詢功能的低層應用程序接口,能在不同的數據庫功能的層次上提供一個統(tǒng)一的用戶界面,同時支持高層的數據庫訪問工具及API。
第一步是裝載 JDBC驅動程序。通常采用的是調用方法 Class.for Name顯式地加載驅動程序類,格式為:
Class.for Name
(“companyName.databaseName.DriverName”);
第二步是與數據庫建立連接,采用的標準方式是調用 Drive rManager.getConnection方法,下列代碼是一般的做法:
Connection conn=Drive rManager.getConnection (url,“Login”,“Pass word");
式中 url為統(tǒng)一資源定位器,代表要進行連接的數據庫?!癓ogin”和“Password”替換為實際登錄的DBMS的用戶名和口令。若連接成功,則返回一個 Connection類的對象 conn。
連接一旦建立,下一步就可向所涉及的數據庫傳送 SQL語句。JDBC提供了 Statement、Prepared-Statement、CallableStatement三個類,用于向數據庫發(fā)送 SQL語句。其中 Statement對象用于發(fā)送不帶參數的簡單的 SQL語句;PreparedStatement對象用于發(fā)送帶或不帶輸入參數的 SQL語句;CallableS-tatement對象用于執(zhí)行 SQL儲存程序的調用。由方法 createStatement建立名為 stmt的 Statement對象的格式為:
Statement stmt=conn.createStatement();
需要指出的是,stmt不包含傳送給 DBMS的 SQL語句,需要提供執(zhí)行 stmt的方法。Statement接口提供了三種執(zhí)行 SQL語句的方法:executeQuery、executeUpdate和 execute。方法 executeQuery用于產生單個結果集;方法 executeUpdate用于執(zhí)行 INSERT、UPDATE或DELETE語句;方法 execute用于執(zhí)行返回多個結果集。下面給出采用 execQuery方法的語句格式:
ResultSet rs= stmt.executeQuery("SQL語句");
executeQuery的參數是一個查詢語句,它的返回值保存在 ResultSet類對象 rs中〔2〕。
表 1 pengshui自動站表
為了方便主程序調用數據庫連接等操作,通常把對數據庫的各種操作,采用請求轉發(fā)的原理設計封裝成一個數據庫連接基類 (DB.java),由數據庫連接基類來封裝基于 JDBC的連接數據庫 (代碼略)。
多線程是 Java的一個重要特點,這使得在一個Java程序內部可同時進行多種運算,從而充分利用系統(tǒng)資源,提高程序運行效率。多線程程序可提高系統(tǒng)的輸入/輸出速度、有效利用系統(tǒng)資源、改善計算機通訊功能等優(yōu)點。
程序運用 Java多線程實現(xiàn)縣局自動站數據、區(qū)域自動站數據的定時獲取和數據存儲校驗及其定時補傳功能。實現(xiàn)數據從市局數據庫接口每小時定時讀取的思路是,啟用一個線程,用 Calendar類(日歷類)的 getInstance()方法得到一個時間點,判斷它是否為指定的上傳時間。true,則執(zhí)行 getdatatoarray方法獲得本站現(xiàn)在的氣象要素數據并添加到本地數據庫,執(zhí)行完畢后,讓線程休眠較長時間段(58min);false,則讓線程休眠較短的時間段 (58s),再執(zhí)行以上判斷,并把這個 if語句置于一個 while (true)語句內反復運行來實現(xiàn)不間斷的自動獲取每小時實時數據。實現(xiàn)數據補傳的思路是,啟用第二個線程,編寫一個從 0到 23的循環(huán),用 dataCheck ()檢索本地數據庫中是否正確插入昨日逐小時的數據,如果沒有數據,則補傳。
構建好數據庫,寫好數據庫連接基類后,接著應設計站點實體類,就站點對象抽象出來的 rainfallhour、airtemp、relhumidity等屬性,分別寫出 set和 get方法,并在這個類中封裝數據存儲和數據校驗等方法。部份核心代碼如下:
主程序采用 MySQL作為數據庫服務器,Net-Beans作為編程工具和設計工具,在程序編寫前,需要建立一個 Web Service Client,并對 WSDL URL、Client Style等參數進行配置[3]。
圖 2 主程序控制流程圖
根據多線程的設計方案和從市局數據庫接口每小時定時讀取的思路,可設計出本數據庫接口應用實例的主程序 (main.java)。部份核心代碼如下:
該實時數據庫接口應用實例在設計時從整體考慮,建立了嚴格的完整性規(guī)則和科學數據庫結構,將定時檢索省(市)級數據庫接口、存儲過程、數據完整性校驗應用到程序設計中,加大了后臺的功能和效率,對數據庫的安全、自動化定時存取做了充分的考慮,提高了氣象數據本地化應用水平。該實時數據庫接口應用程序設計為本地氣象信息系統(tǒng)的開發(fā)打下了良好的基礎,只要結合前臺開發(fā)工具和平臺,就能實現(xiàn)系統(tǒng)的強大功能。
[1] 實時和歷史數據庫檢索接口應用方法—應用文檔說明 .
[2] 趙景林 .利用 JDBC訪問面向 Internet的數據庫[J].微機發(fā)展,2001,11(5):33-35.
TP311
B
2010-09-10
左斌(1973-),男,工程師,主要從事信息網絡管理工作。
1003-6598(2010)增刊 -0183-04