国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于mybatis的數(shù)據(jù)持久層研究

2020-06-29 12:36陳小虎鄧惠俊

陳小虎 鄧惠俊

摘要:為解決傳統(tǒng)的Mybatis數(shù)據(jù)庫持久層在靈活性,可擴(kuò)展性上存在的問題,在深入研究mybatis的技術(shù)架構(gòu)和應(yīng)用流程的基礎(chǔ)上,利用數(shù)據(jù)庫連接池技術(shù)和基于映射表的設(shè)計(jì)方案提出了基于連接池的mybatis持久層優(yōu)化技術(shù),通過實(shí)驗(yàn)的方式證明了該優(yōu)化方案的有效性和可行性。在和c3p0、JDBC、tomcat-jdbc等中間件的性能對(duì)比實(shí)驗(yàn)證明,優(yōu)化后的mybatis在持久層的讀寫性能有了10%以上的提升,有效地節(jié)約了服務(wù)器硬件成本,具有較高的實(shí)用性。

關(guān)鍵詞:mybatis;持久層優(yōu)化;高并發(fā)架構(gòu);讀寫性能

中圖分類號(hào):TP311.1文獻(xiàn)標(biāo)志碼:A

文章編號(hào):2095-5383(2020)02-0032-04

Abstract: ?In order to solve the problems of flexibility and extendibility of persistence layer of traditional mybatis database, the technical framework and application process of mybatis was studied in-depth, and on this basis, the mybatis persistence layer optimization technology based on connection pool technology was proposed by using the database connection pool technology and the design scheme based on mapping table. The effectiveness and feasibility of this optimization scheme have been proved through experiments. Compared with the performance of c3p0, JDBC, Tomcat JDBC and other middleware, it proves that the read-write performance of mybatis optimized in this paper has been improved by more than 10% in the persistence layer, which effectively saves the cost of server hardware and has high practicability.

Keywords:

mybatis; persistent layer optimization; high concurrency architecture; read and write performance

在互聯(lián)網(wǎng)企業(yè)級(jí)項(xiàng)目的開發(fā)中,數(shù)據(jù)庫技術(shù)是最重要的一環(huán),MySQL由于開源免費(fèi)等優(yōu)勢(shì),已經(jīng)成為了企業(yè)項(xiàng)目的數(shù)據(jù)庫首選,傳統(tǒng)JAVA的企業(yè)框架通常采用基于JDBC的mybatis封裝實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的優(yōu)化。學(xué)術(shù)界企業(yè)界有很多關(guān)于mybatis的優(yōu)化,魏靜敏等[1]對(duì)mybatis的批量數(shù)據(jù)插入性能進(jìn)行了研究,并對(duì)項(xiàng)目中常見的mybatis批量插入性能問題提出了解決方案。黃艷秀[2]利用mybatis進(jìn)行了二次開發(fā),結(jié)合spring的依賴注入技術(shù),進(jìn)一步提升了開發(fā)效率,降低了代碼的耦合度。王淵博等[3]整合了mybatis和springmvc,利用mybatis生成了大量代碼,提高了開發(fā)環(huán)境的自動(dòng)化。榮艷冬[4]深入分析了mybatis建立持久層的技術(shù)方案,分析了mybatis存在的優(yōu)勢(shì)和劣勢(shì)。上述方案更多是從應(yīng)用層對(duì)mybatis進(jìn)行創(chuàng)新或研究,但隨著互聯(lián)網(wǎng)業(yè)務(wù)功能的復(fù)雜化,數(shù)據(jù)量爆炸式增長(zhǎng),mybatis在持久層的開發(fā)便捷程度及性能開始出現(xiàn)瓶頸,本文立足于mybatis的底層功能,深入分析了mybatis的工作原理和框架技術(shù),在此基礎(chǔ)上提出了mybatis的持久層優(yōu)化方案。

1 mybatis持久層方案研究

基于MySQL的服務(wù)器技術(shù)和面向?qū)ο蟮拈_發(fā)已經(jīng)成為了當(dāng)前互聯(lián)網(wǎng)開發(fā)的主流,對(duì)于面向?qū)ο蟮募夹g(shù)而言,mybatis持久層操作的對(duì)象都是關(guān)系型數(shù)據(jù)庫中的一條記錄,因此在數(shù)據(jù)庫基本的增刪查改時(shí)都需要將代碼中的對(duì)象轉(zhuǎn)換為一條條數(shù)據(jù)庫的記錄,為了提升轉(zhuǎn)換的效率,避免重復(fù)繁瑣的工作,基于ORM(Object Relational Mapping,關(guān)系對(duì)象映射)的開發(fā)技術(shù)應(yīng)運(yùn)而生,ORM介于程序應(yīng)用層和數(shù)據(jù)層,可以將對(duì)關(guān)系數(shù)據(jù)庫的操作轉(zhuǎn)換為代碼中對(duì)象和屬性的操作。當(dāng)前常見的基于java的ORM框架有TopLink、Druid、c3p0、tomcat-jdbc等[5-8]。由于mybatis提供了更高的開發(fā)自由度,并且具有良好的結(jié)合和代碼自動(dòng)生成能力,可以大幅提高開發(fā)效率,因此受到更多開發(fā)者的歡迎。

1.1 mybatis執(zhí)行原理

MySQL是一個(gè)集成了sql增刪查改以及大量高級(jí)數(shù)據(jù)庫操作的中間件,它封裝了JDBC的所有操作,并且可以通過簡(jiǎn)單的xml配置和注解快速生成代碼,提高開發(fā)者的生產(chǎn)力[9]。MySQL的框架設(shè)計(jì)采用分層的思想[10-11],從邏輯業(yè)務(wù)來說主要有3層:1)API接口層,該層提供了大量的API,這些API功能全面而且強(qiáng)大,可以讓開發(fā)者直接調(diào)用,通過這些API大量簡(jiǎn)化了開發(fā)的工作。2)數(shù)據(jù)處理層,該層主要是通過java對(duì)象進(jìn)行關(guān)系數(shù)據(jù)的解析,實(shí)現(xiàn)java實(shí)體與數(shù)據(jù)庫數(shù)據(jù)的映射,從而完成對(duì)數(shù)據(jù)庫的CURD操作[12]。3)基礎(chǔ)配置層,該層主要負(fù)責(zé)配置數(shù)據(jù)的加載,數(shù)據(jù)庫的管理連接,事務(wù)管理,是mybatis的底層驅(qū)動(dòng)。

Mybatis主要是采用xml作為連接數(shù)據(jù)庫和java代碼的配置文件,利用分層的思想提高了系統(tǒng)的靈活性,另外mybatis采用了類似于MVC的方案,將系統(tǒng)分為DAO層[13]、service層、view層。而每次操作一個(gè)實(shí)體時(shí)都需要制定實(shí)體對(duì)應(yīng)的ID,在大型系統(tǒng)中存在大量的數(shù)據(jù)表,指定ID的操作會(huì)變得非常繁瑣復(fù)雜。同時(shí)mybatis的數(shù)據(jù)庫連接還是基于簡(jiǎn)單的JDBC,建立連接和釋放鏈接都會(huì)占用大量的系統(tǒng)資源。

1.2 對(duì)象文件編程優(yōu)化

對(duì)象文件的簡(jiǎn)化主要是減少開發(fā)的復(fù)雜度,其方案如下:直接在根目錄執(zhí)行./gradlew mybatis Generator實(shí)現(xiàn)新增表映射方式。1)項(xiàng)目中的gradle控制面板中找到項(xiàng)目配置。2)在數(shù)據(jù)庫中建立表結(jié)構(gòu)信息。3)generatorConfig.xml 文件中配置要新映射的數(shù)據(jù)庫表 注意: 一般需要?jiǎng)h除不需要操作的表信息,單獨(dú)留下需要操作的表信息。4)在gradle控制面板中找到項(xiàng)目根目錄,在Tasks/mybatis 中雙擊運(yùn)行目錄中的 mybatisGenerator (涉及以下文件) -?entity/ XxxxXxx文件 -?entity/ XxxxXxxExample文件-?entity/ XxxxXxxKey文件 -?mapper/ XxxxXxxMapper文件 -?mapper/ XxxxXxxSqlProvider文件。5)注意其中有些自定義修改的Mapper和provider文件要回滾或者合并(例如批量插入的邏輯)。

1.3 連接池優(yōu)化

連接池優(yōu)化方案的核心思路是利用獨(dú)立的線程池來異步實(shí)現(xiàn)連的創(chuàng)建回收,采用定時(shí)的線程池來監(jiān)控連接泄露。主要流程為:

1)申請(qǐng)連接,利用一個(gè)線程池mbsPool來對(duì)連接資源進(jìn)行管理,用一個(gè)數(shù)據(jù)結(jié)構(gòu)ConcurrentBag作為所有連接共享類,封裝了PoolEntry對(duì)象,PoolEntry對(duì)象利用borrow方法從bag中獲取,再通過PoolEntry.createProxyConnection來生成連接池的返回。

2)回收連接,當(dāng)數(shù)據(jù)庫操作完畢之后,調(diào)用close方法來通知連接池該線程可以關(guān)閉,此時(shí)通過mbsPool調(diào)用ConcurrentBag的fillPool方法來對(duì)連接池中的數(shù)據(jù)進(jìn)行回收。同時(shí)也可以利用evictConnection方法手動(dòng)對(duì)物理連接關(guān)閉,而本方法在線程池內(nèi)部進(jìn)行,一般不需要開發(fā)者顯式調(diào)用。

3)創(chuàng)建連接,本文的優(yōu)化方案定義了addConnectionExecutor類來完成新連接的生成,其具體的方法是PoolEntryCreate,當(dāng)ConcurrentBag中存在等待線程,或者有連接被關(guān)閉時(shí),會(huì)觸發(fā)調(diào)用PoolEntryCreate。

另外需要注意的是,本文實(shí)現(xiàn)的連接池提供了3種類型,第1種是固定大小連接池(fixPool),該連接池在初始化前就配置好池的大小,一旦池滿,有新的連接請(qǐng)求過來則會(huì)被丟棄不處理;第2種是DynamicPool,這是一種動(dòng)態(tài)擴(kuò)容的連接池,在連接池才啟動(dòng)時(shí)按照初始設(shè)置來配置連接池的大小,而當(dāng)連接池中的連接數(shù)超過閾值時(shí)可以動(dòng)態(tài)擴(kuò)容;第3種是QueuePool,這種連接池的大小也已經(jīng)在初始化過程中設(shè)置好,但是當(dāng)連接池已經(jīng)滿了的情況下如果收到新的連接請(qǐng)求會(huì)將其放置到一個(gè)隊(duì)列中,等到連接池空閑下來再從隊(duì)列中按照先進(jìn)先出的原則取出連接進(jìn)行處理。

1.4 集成spring

Mybatis作為MySQL數(shù)據(jù)庫的中間件,其主要作用是用于和j2ee框架的集成,本文的集成流程如下:

1)配置mybatis.?通過maven的打包工具,我們通過如下配置配好mybatis。

org.mybatis

mybatis-spring

1.2.0

org.springframework

spring-context-support

3.1.3.RELEASE

commons-logging

commons-logging

org.springframework

spring-jdbc

3.1.3.RELEASE

org.springframework

spring-test

3.1.3.RELEASE

test

org.aspectj

aspectjrt

1.6.8

org.aspectj

aspectjweaver

1.6.8

2)在spring中設(shè)置mybatis,為了讓spring實(shí)例化mybatis組件,如sqlsessionfactory,sqlsession和mapper等對(duì)象,需要在spring中進(jìn)行配置。在本文實(shí)現(xiàn)的方案中,一旦配置了sqlsessionfactory bean,就需要對(duì)應(yīng)地配置sqlsessiontemplate bean,它是一個(gè)線程安全的spring bean,使用者可以從中獲取線程安全的sqlsession對(duì)象。因?yàn)閟qlsessiontemplate提供了線程安全的sqlsession對(duì)象,所以可以與多個(gè)springbean共享同一個(gè)sqlsessiontemplate實(shí)例。在概念上,sqlsessiontemplate類似于spring dao模塊的jdbctemplate。

3)在完成了spring中的設(shè)置之后,可以開始進(jìn)行ORM(實(shí)體關(guān)系映射)的配置,在spring的應(yīng)用中,最常用的ORM操作主要是數(shù)據(jù)庫的增、刪、查、改。為了實(shí)現(xiàn)4大操作,需要完成關(guān)系數(shù)據(jù)庫和實(shí)體的一一對(duì)應(yīng),也就是需要在實(shí)際開發(fā)中將每一個(gè)實(shí)體的操作都寫到ORM配置里。

2 實(shí)驗(yàn)和結(jié)果分析

通過本文的優(yōu)化算法,利用本文線程池技術(shù)對(duì)mybatis持久層的操作進(jìn)行優(yōu)化,并和常用的數(shù)據(jù)庫持久層中間件c3p0、JDBC、tomcat-jdbc進(jìn)行對(duì)比。對(duì)比實(shí)驗(yàn)方案如下:初始連接和最小連接都設(shè)置為15,最大連接設(shè)置為100,打開關(guān)閉數(shù)據(jù)庫連接的次數(shù)設(shè)置為100萬次,通過使用MySQL在不同線程并發(fā)下的響應(yīng)時(shí)間來進(jìn)行測(cè)試,測(cè)試結(jié)果如圖1所示。

在分別5、20、50、100個(gè)連接數(shù)的情況下,其詳細(xì)的響應(yīng)時(shí)間如表1所示。

由表1可知,在高并發(fā)的響應(yīng)時(shí)間上,本文方案>tomcat-jdbc>dbcp>c3p0。本文方案在并發(fā)較高的情況下,性能基本上沒有下降,同時(shí)也可以看到c3p0連接池的性能很差,不建議使用該數(shù)據(jù)庫連接池。

3 結(jié)語

本文針對(duì)mybatis在數(shù)據(jù)庫持久化過程中開發(fā)邏輯復(fù)雜,數(shù)據(jù)庫連接容易耗盡,讀寫操作響應(yīng)時(shí)間慢等問題,提出了一套基于mybatis持久層的優(yōu)化方案,本文設(shè)計(jì)了3種不同類型的連接池,開發(fā)者可以通過配置方便地選擇自己需要的連接池類型,同時(shí)在連接池的實(shí)現(xiàn)部分,本文在連接池的創(chuàng)建、回收和關(guān)閉上通過異步的方式,在每次關(guān)閉連接的時(shí)候都將連接資源放回連接池,并讓連接池管理了連接的斷開、建立、回收等過程。通過和c3p0、JDBC、tomcat-jdbc等中間件的實(shí)驗(yàn)證明,本文優(yōu)化后的mybatis在持久層的讀寫性能有了10%以上的提升,有效節(jié)約了服務(wù)器硬件成本,具有較高的實(shí)用性。

參考文獻(xiàn):

[1]魏靜敏, 劉歡杰.?基于Mybatis框架的批量數(shù)據(jù)插入的性能問題的探討[J].?計(jì)算機(jī)光盤軟件與應(yīng)用, 2013(19):160-162.

[2]黃艷秀.?基于mybatis的面向數(shù)據(jù)庫自動(dòng)生成技術(shù)[J].?河南科技, 2014(4):29-30.

[3]王淵博, 周樹軍.?農(nóng)村物流“最后一公里”互聯(lián)網(wǎng)信息服務(wù)平臺(tái)研究[J].?現(xiàn)代電子技術(shù), 2018, 41(22):42-45,49.

[4]榮艷冬.關(guān)于Mybatis持久層框架的應(yīng)用研究[J].?信息安全與技術(shù), 2015, 6(12):86-88.

[5]宋波, 劉杰, 周傳生,等.?基于TopLink的J2EE數(shù)據(jù)持久層的實(shí)現(xiàn)[J].?微電子學(xué)與計(jì)算機(jī), 2006, 23(8):132-135.

[6]YANG F, TSCHETTER E, MERLINO G, et al.?Druid: a real-time analytical data store[C]// Acm Sigmod International Conference on Management of Data,2014.

[7]于廣和.?MySQL數(shù)據(jù)庫服務(wù)器下C3P0連接池的配置[J].?金融科技時(shí)代, 2010(9):67.

[8]YONG S.?A browser/server product data management system[C]// Power Electronics & Design, 2011.

[9]JEROEN O, DAVID J, SAIKAT D, et al.?RMySQL: database interface and MySQL driver for R[J].?2018.

[10]NASH T, OLMSTED A.?Performance vs.?security: implementing an immutable database in MySQL[C]// 2017 12th International Conference for Internet Technology and Secured Transactions (ICITST), 2017.

[11]SN R, MU±OZ A, CASTRO A L, et al.?Executing complexity-increasing queries in Relational (MySQL) and NoSQL (MongoDB and EXist) size-growing ISO/EN 13606 standardized EHR databases[J].?JVis Exp, 2018(133).

[12]張世雄.?PHP操作MySQL數(shù)據(jù)庫的面向?qū)ο竽P皖悓?shí)現(xiàn)[J].?清遠(yuǎn)職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2018, 11(6):51-54.

[13]陳欣.?基于java三層構(gòu)架的管理信息系統(tǒng)中DAO層的構(gòu)建探索[J].?科技資訊, 2015, 13(11):26-27.