1. 程式人生 > >專案總結:每隔5分鐘從資料庫拉取資料轉為Json格式通過WebService從客戶端傳送至服務端

專案總結:每隔5分鐘從資料庫拉取資料轉為Json格式通過WebService從客戶端傳送至服務端

   第一次接手需求寫的小專案,過程也有點坎坷,以此記錄總結編碼過程中遇到的問題。

   專案背景:本次寫的是一個小模組,主要為客戶端,作用是每隔5分鐘從資料庫拉取資料傳送至服務端。本次專案採用的是spring3+Quartz+JdbcTemplate+JSONArray+RPCService。以下分為幾個模組詳述。

   專案思路:將本次需求分為三個模組:定時器+查詢資料+客戶端傳送。

   一、定時器

由於本專案整體採用的spring的框架,所以本次定時器採用的是Spring+Quartz的模式。Quartz配合cron表示式,能夠執行每隔一段時間/定點執行等強大的定時功能。好了,我們來看定時器的編寫。Quartz分為配置+任務方法兩塊,配置在spring的xml檔案中編寫,具體的任務寫在具體類的execute方法中。

首先,我們建立一個spring的配置檔案:applicationContext.xml,在裡面寫好定時器的要執行的任務、觸發器等內容;

applicationContext.xml

Task.java

以上Quartz的編寫就完成了,接下來是執行中可能出現的問題:

1.無法執行定時器任務

1)可能整個專案是個Web專案,需要Tomcat啟動後載入spring容器才能執行定時器任務;

2)可能需要需要先啟動其他方法才能執行定時器任務;

3)可能IDEA的Server配置有問題,開啟Run/DebugConfigurations,TomcatServer-Deployment,將下面war exploded檔案改為External Source下專案target的專案.war檔案;

2.定時器多次執行

1)可能是Tomcat的配置問題,需要更改其server.xml將AutoDeploy改為false(詳情可百度)

2)在定時器執行的具體任務中誤使用了載入應用上下文(ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml"),導致執行的時候反覆載入上下文,陷入遞迴迴圈,重複執行任務。

二、查詢資料

查詢資料這邊的工作包括資料庫設計、資料庫連線、查詢方法。本次使用了Mysql 和Oracle兩種資料庫,下面會一一介紹。

1.資料庫設計

本次的資料包括很多屬性,簡化後大約是一個裝置裡有很多屬性,每個屬性隨時間產生資料,有多個裝置。目前採用的設計方法是建一張表,表的欄位包括裝置ID,屬性1,屬性2....時間,然後ID1的幾十條記錄隨時間變化,接著新增ID2的幾十條記錄隨時間變化....這樣設計比較簡單。但是考慮健壯性的話,比如後續新增其他裝置,與現有裝置屬性並不一致怎麼辦?可以建一張屬性大表,後續裝置屬性引用這張大表.....在此不做過多表述,以後遇到再寫。

屬性表

2、資料查詢

資料庫採用了mysql和oracle,但是實現的思路是一樣的,採用的是JdbcTemplate和C3P0。在這裡先說總體的,後續再說兩者的差異。

首先,在spring配置檔案裡寫JdbcTemplate和C3P0的配置。

applicationContext.xml

然後,寫一個pojo,也就是跟資料庫對應的實體類,在此不做過多表述。

接著,寫Dao方法,因為spring已經幫你例項化好了,所以可以直接利用註解獲取(JdbcTemplate的使用方法不過多說,網上有很多介紹,這裡只取了查詢說明)

最後,就可以隨便呼叫這個Dao中的方法啦(可以通過@Resource註解獲取Dao的例項)。

這裡說一下mysql和Oracle的一些差異:

1)驅動

需要c3p0、connector等一些必要的jar包就不說了,這裡的差異有,在IDEA的maven專案中,mysql的這些jar包可以通過maven直接獲取,但是oracle由於商業原因,需要新增到maven的本地倉庫才能獲取(具體操作可見手動將本地jar包新增至maven倉庫),其中可能遇到的問題有:

a)    cmd執行命令時提示mvn不是內部或外部命令

win10的path變數直接寫maven安裝的絕對路徑

b)    cmd提示安裝成功但是專案引用仍報錯

系統預設安裝到預設的maven倉庫中,而你的專案使用的是自定義的maven倉庫地址。修改安裝的maven的conf/settings:將<localRepository>改為你自定義Respository的路徑

c)  cmd提示安裝成功Repository地址也正確但是專案引用仍報錯

注意引用的groupId是否和安裝時的一致,比如下圖,有時會寫com.oracle

2)查詢語句的差別

Mysql:SELECT * FROM ammeter WHERE currentTime = "03:55"

所以程式中可以寫成:String sql="select * from ammeter where currentTime = "+"?";

oracle:SELECT * FROM "ammeter" WHERE "currentTime" = '03:55'

所以程式中可以寫成:String sql="select * from \"ammeter\" where \"currentTime\" = "+" ? "+ " ORDER BY \"tabNumber\" ";

3)Oracle中沒序號自動遞增的功能

三、客戶端傳送

1、將查詢到的資料轉化為Json格式

轉化為Json有現成的方法,只要應用相關的jar包就行了,我是直接引用的JSONArray.fromObject的方法,不做過多表述,詳情請見Json和java物件的互轉

需要注意的一點是JsonArray的maven jar包使用的是jdk 1.5的

2、呼叫WebService傳送資料(RPC方式)

這一塊參考的呼叫WebService的三種方式,在此不做過多表述

引用jar包如下

四、關於web.xml的配置

由於整個專案用了Spring3,所以需要在web.xml裡配置ContextLoaderListener。ContextLoaderListener的作用是在啟動Web容器時,自動裝配Spring applicationContext.xml的配置資訊。如果applicationContext.xml檔案沒有在/WEB-INF/下,或檔名不一致,或存在多個Spring配置檔案,需要搭配context-param進行修改applicationContent.xml的位置資訊。而<listener>Listener 的作用非常類似於load-on-startup Servlet,用於在Web 應用啟動時,啟動某些後臺程式,這些後臺程式負責為系統執行提供支援。

 

        以上就是本次專案總結的一些點,第一次寫專案的時候無從下手,這時候就學著把一個需求慢慢拆解,依次尋找突破口,慢慢就好解決了。其中由於基礎尤其是spring不熟,踩了很多坑,也幸虧有導師的協助,因此把這次經驗寫下來,以作後續警示。總的來說寫出程式成就感還是很高的,希望以後能成長為理想中的Java大神。