為了保證車載動力電池的安全運行,全面掌握其運行狀態,電動汽車遠程監控系統已被各個廠家越來越重視,如何對監控產生的海量數據進行安全快速的查詢是遠程監控中的重要研究課題。本文著重介紹了一種基于Hibernate框架針對監控車輛的海量數據進行并行查詢的設計思路、關鍵技術分析以及具體實現手段。通過將海量數據在ORACLE數據庫中分區存儲,查詢終端經Hibernate服務器并行查詢數據,保證了數據庫安全的同時縮短了查詢所需時間,達到了預期效果。
【關鍵詞】遠程監控 Hibernate 數據庫 并行查詢
電動汽車遠程監控系統已被各個廠家越來越重視,而對監控產生的海量數據進行安全快速查詢是遠程監控中的重要研究課題。
基于Hibernate的遠程監控數據并行查詢目的在于:
(1)確保數據庫安全;
(2)確保海量數據存儲合理;
(3)提高海量數據查詢效率。
本課題實現了通過中間Hibernate服務器將查詢終端和數據庫服務器間安全連接,通過按時間分區,保證了數據存儲合理及在此基礎上的并行查詢算法的實現。
1 基于Hibernate的遠程監控系統設計
架構圖如圖1,下面詳細介紹模塊。
1.1 遠程監控終端采集模塊
用于采集動力電池運營數據并將數據上傳。
1.2 數據庫集群
數據處理中心,負責存儲查詢數據,采用的是ORACLE11gR2 RAC版本。
1.3 遠程監控系統應用服務器集群
數據接入服務器,負責接收遠程終端采集來的數據。
1.4 Hibernate中間服務器模塊
響應客戶端的數據操作,保證數據安全。
1.5 客戶端模塊
包括pc,手機端等,通過中間服務器和數據庫進行數據交換。
基于Hibernate的并行查詢主要研究的是數據庫安全和快速查詢響應,因此遠程監控終端采集模塊和應用服務器集群不在此文的研究之中。
2 關鍵技術的研究
本項目中通過將數據庫按時間進行分區,使海量數據合理存儲;在查詢端和數據庫服務器集群間添加Hibernate框架中間服務器,保證數據安全;在客戶端用并行查詢的算法提高查詢效率。
2.1 數據庫分區
在存有海量數據的表格中,查詢效率非常的低,進行按天分區后,查詢時間大為縮短但還是未達到預期要求,因此我們提出了在分區基礎上的并行查詢。
2.2 Hibernate中間服務器
傳統三層編程將客戶端直連數據庫,造成了安全隱患。而使用Hibernate架構,采用中間服務器處理客戶端請求,避免了將數據服務器直接暴露在公網上,確保了數據安全。
2.3 并行查詢算法
本項目并行查詢基于數據庫分區和Hibernate架構進行。在數據庫中,我們將記錄按天進行分區,為并行查詢算法提供了可行基礎。
數據庫中的記錄雖不斷增加,但每天的記錄是有限的,分區數據具備可操作性。如查詢某輛車某月的數據,可以將數據查詢拆分成30個并發線程,每個線程只查詢一天的記錄,將查詢時間壓縮至1天。
圖2是兩種查詢方式的流程對比。
但長時距數據,不可能去開啟無限線程,本項目采用了給定線程數上限按需循環去解決這個矛盾。在單個分區內進行查詢效率最高,并行查詢就是將所有的查詢從跨分區的需求拆分為針對各個單獨數據分區的查詢,使查詢效率大為提高。
本項目客戶端采用C#開發,以單體信息查詢為例,部分代碼示例如下:
2.3.1 首先設置線程上限。
private long totalCount = 0; //存放計算結果
private readonlyintthreadCounts = 30; //處理的線程數
private static object locker = new object(); //線程鎖
staticTCellInfoDao()
{
intminWorker, minIOC;
ThreadPool.GetMinThreads(out minWorker, out minIOC);
}
2.3.2 計算并發線程實際需要的數量,開啟線程,在同步完成后給出結果統計
/// 并發計算count(*)
///
DateTimenextEndTime = DateTime.Parse(endTime.ToString("yyyy-MM-dd ")); //結束日期前零點時間 00:00:00
TimeSpants = endTime - nextbeginTime;
double seconds = ts.TotalSeconds;
if (seconds <= 0) //查詢時間同一天
{
ManualResetEventmre = new ManualResetEvent(false);
manualEvents.Add(mre);
CellParams par = new CellParams();
par.BeginDate = beginTime;
par.EndDate = endTime;
par.BwtId = bwtid;
par.UserID = userID;
par.mrEvent = mre;
ThreadPool.QueueUserWorkItem(CalcCounts, par);
WaitHandle.WaitAll(manualEvents.ToArray()); //等待所有線程執行完畢,返回總數據
}
else //查詢時間跨天
{
//計算開頭和結尾時間段中數據
DateTime b = beginTime;
DateTime e = nextbeginTime;
for (inti = 0; i< 2; i++)
{
ManualResetEventmre = new ManualResetEvent(false);
manualEvents.Add(mre);
CellParams par = new CellParams();
par.BeginDate = b;
par.EndDate = e;
par.BwtId = bwtid;
par.mrEvent = mre;
par.UserID = userID;
ThreadPool.QueueUserWorkItem(CalcCounts, par);
b = nextEndTime;
e = endTime;
}
if (manualEvents.Count !=0)
WaitHandle.WaitAll(manualEvents.ToArray()); //等待所有線程執行完畢,返回總數據
if (manualEvents.Count != 0)
{
manualEvents.Clear();
}
//計算整數天的數據總數
inttotalDays = (nextEndTime - nextbeginTime).Days;
intprocessCounts = totalDays / threadCounts; //總處理次數,每次處理64條查詢
intlastCounts = totalDays % threadCounts; //剩余天數
b = nextbeginTime; //開始時間下一天零點開始
for (inti = 0; i { for (int j = 0; j { ManualResetEventmre = new ManualResetEvent(false); manualEvents.Add(mre); CellParams par = new CellParams(); par.BeginDate = b; par.EndDate = b.AddDays(1); //計算一天的分區的數據量 par.BwtId = bwtid; par.UserID = userID; par.mrEvent = mre; ThreadPool.QueueUserWorkItem(CalcCounts, par); b = b.AddDays(1); } if (manualEvents.Count != 0) WaitHandle.WaitAll(manualEvents.ToArray()); //等待所有線程執行完畢,返回總數據 if (manualEvents.Count != 0) { manualEvents.Clear(); } } //計算剩余天數 for (inti = 0; i { ManualResetEventmre = new ManualResetEvent(false); manualEvents.Add(mre);
CellParams par = new CellParams();
par.BeginDate = b;
par.EndDate = b.AddDays(1);
par.BwtId = bwtid;
par.UserID = userID;
par.mrEvent = mre;
ThreadPool.QueueUserWorkItem(CalcCounts, par);
b = b.AddDays(1);
}
if (manualEvents.Count != 0)
WaitHandle.WaitAll(manualEvents.ToArray()); //等待所有線程執行完畢,返回總數據
if (manualEvents.Count != 0)
{
manualEvents.Clear();
}
}
returntotalCount;
}
3 運行情況
采用了基于Hibernate架構的并行查詢算法后,按時間段查詢車輛數據的效率提高明顯,單輛車每月數據查詢的響應時間提高至0.3秒,每年數據查詢的響應時間提高至2秒,用戶使用體驗良好,達到了項目預期。
4 結束語
基于Hibernate架構的并行查詢算法克服了海量數據查詢的難題,數據查詢不再受限于數據表格中的記錄總數,也減少了對于查詢的時間段長短的依賴,在實際應用中很好的滿足了用戶的需求。
參考文獻
[1]孫衛琴.精通Hibernate[M].北京:電子工業出版社,2005.
[2]周亮.Oracle DBA實戰攻略:運維管理、診斷優化、高可用與最佳實踐[M].北京:機械工業出版社,2013.
作者簡介
卞林 (1976-),男,大學本科學歷。現為合肥國軒高科動力能源有限公司工程師。主要研究方向為電動汽車遠程監控系統。
鄭中華(1988-),男,碩士學位。現為合肥國軒高科動力能源有限公司工程師。主要研究方向為電動汽車遠程監控系統。
唐曉新(1989-),女,碩士學位。現為合肥國軒高科動力能源有限公司工程師。主要研究方向為電動汽車電池管理系統。
作者單位
合肥國軒高科動力能源有限公司 安徽省合肥市 230012