High-Performance Hibernate -...
-
Upload
nguyenduong -
Category
Documents
-
view
219 -
download
0
Transcript of High-Performance Hibernate -...
High-PerformanceHibernate
Speaker:VladMihalcea
Format:Conférence
Date:21avril2016
Slides:http://fr.slideshare.net/VladMihalcea/high-performance-hibernate-devoxx-france
VladestHibernateDeveloperAdvocateettientunblog:https://vladmihalcea.com/
D’aprèsAppDynamics,«Plusdelamoitiédesproblèmesdecontentionsviennentdelabase
dedonnées».
Letempsderéponsed’unerequêteestlasommedestempsderéponsesuivant:
Connectionproviders
PlusieursConnectionproviderssontfournisparHibernate.Ex:HikariConnectionProvider,
DataSourceProxyConnectionProvider(àprivilégier),DriverMamangerConnectionProviderImpl.
FlexyPoolestunframeworkquipermetdemonitorerlesconnexions.
Pluscourteestlatransaction,meilleuresontsesperformances.
Connectionreleasemode:triccky
hibernate.connection.release_modeAFTER_TRANSACTION,AUTO,AFTER_STATEMEMENT(JPA)
PourJPA,utiliserafter_transactionexplicitermentcarplusperformant.
Identifiergenerators
• Identifygenerator
o DefautforSQLServeretMySQLwhenusingAUTO
o DisablesJDBCbatchinserts
• Sequencegenerator
o DefaultforOracleandPostgreSQLwhenusingauto
o Paramétragenécessairedehibernate.id.new_generator_mappingsàtrue
avecHibernate5(cf.photop)
o Sequencepooledoptimiseravec50rows
• Tablegenerator
o Pasunetrèsbonnesolutionensoit.Moinsperformancequelesséquences.
IdentifyvsTablesur100rows
Dépendgrandementdunombredethreads
Relationships
Leastefficient:OneToManyList<Post>
JDBCBatching
Propriétéhibernate.jdbc.batch_sizepouruneconfigurationglobaleIlestprévud’avoiruneconfigurationplusgranulaire,auniveaudelasession
Pasdecontradictionàsonutilisation.Mêmeavecunevaleurde10,ongagneen
performance.
Cascadingandbatching:hibernate.order_insertsandorder_updatesàtrue
Dansunefutureversiond’HibernateORM,ilestprévudesupporterlesdelete.
Versionningandbatching:
DésactivépardéfautsurOracle10gdialectsenHibernate3et4
ActivépardéfautdansHibernate5.
hibernate.jdbc.batch_versioned_data=true
Fetching
Problèmeden°1:ramenertropdedonnées.
Plusieurspointsàregarder�
1. JDBCfetchsize
2. JDBCResultSetsize
3. DTOvsEntityqueries
4. Associationfetching
JDBCfetchsize
SurOracle,10pardéfaut.�SessionFactorysettings:hibernate.jdbc.fetch_sizeà100
ConfigurationlocaleàunerequêteavecQueryHints.HINT_FETCH_SIZE(HintHibernateet
nonOracle)
Resultsetsizelimit
LimiterlenombredelignesrenvoyéesavecsetMaxResults()
Transactionspluscourtes.
NefaitpaspartiedustandardSQL,maisimplémentépartouteslesbases.
Resultsetcolumncount
Selectingallcolumnsvsselectionacustomprojection
LefameuxSELECT*vsSELECTpc.version
Ledéveloppeurdoitseposerlaquestion:quelledatajedoisavoirbesoin?
DTOprojectionsrecommandéespour:
• Read-onlyviews
• Treestructures(RecursiveCTE)
• PaginatedTables
• Analytics(Windowsfunctions)
Entityquesriesutiliséespour:
• Writingdata
• Webflows/Multi-requestlogicalteansactions
• Application-levelrepeatablereads
• Detachedentities/PersistenceContextType.EXTENDED
• Optimisticconcurrencycontrol(e.g.version,dirtyproperties)
Fetchingassociations:
Valeurpardéfautenfonctiondel’annotation.
«YoucannotturnanEagerintoaLazy.YoucanturnalazyintoanEager»
Choixqu’onpeutdifficilementfaireàlaconceptiondumodèle.
Conseil:utiliserlaztpardéfaut,puislesfetchdirectivedejPQL/Criteria,EntityGraph
(@FetchProfile)
UtiliserEagerimpliquedestempsderéponsessupplémentaires.
OpenSessioninViewanti-pattern
Anepasutiliser.
SonutilisationavecMySQLentrainebeaucoupde«pressure»surlabase.
TemporarySessionanti-pattern
Nepasutiliserlehibernate.enable_lazy_load_no_trans
Caching1erconseil:tunerleSharedBufferdeladatabase
DBMasteretDBSlave
«Thereareonlythowthingshardin…»CitationdePhilKarlton
Stratégiedecaching:leplusfiableestlastratégieTRANSACTIONALdeJTA.Mais
READ_WRITEestengénérallechoixpardéfautleplusapproprié.
CollectionandQuerycaches
• Complemententitycaching
• Storeonlyentityidentifiers
• Read-Through
• Invalidation-based