999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種基于Hibernate的并行查詢方法

2016-07-10 04:40:21卞林
電子技術與軟件工程 2016年7期
關鍵詞:數據庫

為了保證車載動力電池的安全運行,全面掌握其運行狀態,電動汽車遠程監控系統已被各個廠家越來越重視,如何對監控產生的海量數據進行安全快速的查詢是遠程監控中的重要研究課題。本文著重介紹了一種基于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

猜你喜歡
數據庫
數據庫
財經(2017年15期)2017-07-03 22:40:49
數據庫
財經(2017年2期)2017-03-10 14:35:35
兩種新的非確定數據庫上的Top-K查詢
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
數據庫
財經(2015年3期)2015-06-09 17:41:31
數據庫
財經(2014年21期)2014-08-18 01:50:18
數據庫
財經(2014年6期)2014-03-12 08:28:19
數據庫
財經(2013年6期)2013-04-29 17:59:30
主站蜘蛛池模板: 欧美日韩北条麻妃一区二区| 国产亚洲精| 一级毛片无毒不卡直接观看| 无码精品一区二区久久久| 久久精品亚洲中文字幕乱码| 奇米精品一区二区三区在线观看| 全裸无码专区| 国产国拍精品视频免费看 | 成人午夜亚洲影视在线观看| 国产福利免费视频| 欧美日韩免费| 成人在线观看不卡| 欧美成人精品一区二区| 播五月综合| 亚洲色中色| 中文字幕色站| 国产乱子伦手机在线| 91视频99| 日韩资源站| 亚洲综合专区| 精品国产网| 免费一级毛片不卡在线播放| 中国一级毛片免费观看| 欧美a在线| 中文无码日韩精品| 在线观看91精品国产剧情免费| 国产精品大尺度尺度视频 | 久久黄色免费电影| 国内99精品激情视频精品| 日韩欧美中文字幕在线韩免费| 青青草a国产免费观看| 国产成人三级在线观看视频| 毛片视频网| 人妻精品久久无码区| AV天堂资源福利在线观看| 欧美国产菊爆免费观看| 国产91精品久久| 波多野结衣在线一区二区| 二级特黄绝大片免费视频大片| 99视频国产精品| 亚洲一区二区三区中文字幕5566| 999国内精品久久免费视频| 亚洲天堂视频在线观看| 欧美、日韩、国产综合一区| 亚洲国产午夜精华无码福利| 亚洲精品无码抽插日韩| 青青国产在线| 精品一区二区无码av| 亚洲国产精品日韩av专区| 欧美特黄一免在线观看| 欧洲成人免费视频| 国产成人AV综合久久| 欧美区一区| 国产精品久久久久久搜索| 美女无遮挡免费视频网站| 婷婷亚洲视频| 久热精品免费| aaa国产一级毛片| 免费无码AV片在线观看中文| 成人在线欧美| 日韩免费毛片| 国产福利不卡视频| 手机在线免费不卡一区二| 国产精品尹人在线观看| 亚洲狼网站狼狼鲁亚洲下载| 国产麻豆精品久久一二三| 亚洲日产2021三区在线| 无码高潮喷水在线观看| 国产精品无码制服丝袜| 毛片网站在线看| 欧美色综合网站| 欧美一区中文字幕| 中文纯内无码H| 久久久久久国产精品mv| 国产婬乱a一级毛片多女| 综合色婷婷| 农村乱人伦一区二区| 国产香蕉在线| 国产第一福利影院| 亚洲精品午夜无码电影网| 国产高清在线观看91精品| 在线看片国产|