High-Performance Java Persistence Get the most out of your persistence layer Vlad Mihalcea © 2015 - 2016 Vlad Mihalcea Tweet This Book! Please help Vlad Mihalcea by spreading the word about this book on Twitter! Tomywifeandkids Contents I Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1. Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1 Thedatabaseserverandtheconnectivitylayer . . . . . . . . . . . . . . . . . . . . 3 1.2 Theapplicationdataaccesslayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.1 TheORMframework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.2 Thenativequerybuilderframework . . . . . . . . . . . . . . . . . . . . . . 4 2. PerformanceandScaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1 Responsetimeandthroughput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Databaseconnectionsboundaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3 Scalingupandscalingout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.3.1 Master-Slavereplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3.2 Multi-Masterreplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.3 Sharding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 II JDBC and Database Essentials . . . . . . . . . . . . . . . . . 14 3. JDBCConnectionManagement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.1 DriverManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2 DataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2.1 Whyispoolingsomuchfaster? . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3 Queuingtheorycapacityplanning . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.4 Practicaldatabaseconnectionprovisioning . . . . . . . . . . . . . . . . . . . . . . 26 3.4.1 Areal-lifeconnectionpoolmonitoringexample . . . . . . . . . . . . . . . . 27 3.4.1.1 Concurrentconnectionrequestcountmetric . . . . . . . . . . . . . . 28 3.4.1.2 Concurrentconnectioncountmetric . . . . . . . . . . . . . . . . . . . 29 3.4.1.3 Maximumpoolsizemetric . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4.1.4 Connectionacquisitiontimemetric . . . . . . . . . . . . . . . . . . . 30 3.4.1.5 Retryattemptsmetric . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4.1.6 Overallconnectionacquisitiontimemetric . . . . . . . . . . . . . . . 31 3.4.1.7 Connectionleasetimemetric . . . . . . . . . . . . . . . . . . . . . . . 32 4. BatchUpdates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 CONTENTS 4.1 BatchingStatements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.2 BatchingPreparedStatements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2.1 Choosingtherightbatchsize . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.2.2 Bulkoperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.3 Retrievingauto-generatedkeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.3.1 Sequencestotherescue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5. StatementCaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.1 Statementlifecycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.1.1 Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.1.2 Optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.1.2.1 Executionplanvisualization . . . . . . . . . . . . . . . . . . . . . . . 47 5.1.3 Executor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.2 Cachingperformancegain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.3 Server-sidestatementcaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.3.1 Bind-sensitiveexecutionplans . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.4 Client-sidestatementcaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6. ResultSetFetching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.1 ResultSetscrollability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.2 ResultSetchangeability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 6.3 ResultSetholdability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.4 Fetchingsize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.5 ResultSetsize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.5.1 Toomanyrows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.5.1.1 SQLlimitclause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 6.5.1.2 JDBCmaxrows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.5.1.3 Lessismore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.5.2 Toomanycolumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 7. Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 7.1 Atomicity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 7.2 Consistency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.3 Isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 7.3.1 Concurrencycontrol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 7.3.1.1 Two-phaselocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 7.3.1.2 Multi-VersionConcurrencyControl . . . . . . . . . . . . . . . . . . . 82 7.3.2 Phenomena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 7.3.2.1 Dirtywrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 7.3.2.2 Dirtyread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.3.2.3 Non-repeatableread . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 7.3.2.4 Phantomread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 7.3.2.5 Readskew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 CONTENTS 7.3.2.6 Writeskew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 7.3.2.7 Lostupdate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 7.3.3 Isolationlevels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 7.3.3.1 ReadUncommitted . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 7.3.3.2 ReadCommitted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7.3.3.3 RepeatableRead . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 7.3.3.4 Serializable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 7.4 Durability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 7.5 Read-onlytransactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.5.1 Read-onlytransactionrouting . . . . . . . . . . . . . . . . . . . . . . . . . . 104 7.6 Transactionboundaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 7.6.1 Distributedtransactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 7.6.1.1 Two-phasecommit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 7.6.2 Declarativetransactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 7.7 Application-leveltransactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 7.7.1 Pessimisticandoptimisticlocking . . . . . . . . . . . . . . . . . . . . . . . . 114 7.7.1.1 Pessimisticlocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 7.7.1.2 Optimisticlocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 III JPA and Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 8. WhyJPAandHibernatematter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 8.1 Theimpedancemismatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 8.2 JPAvsHibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 8.3 Schemaownership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 8.4 Write-basedoptimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 8.5 Read-basedoptimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 8.6 Wrap-up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 9. ConnectionManagementandMonitoring . . . . . . . . . . . . . . . . . . . . . . . . . 133 9.1 JPAconnectionmanagement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 9.2 Hibernateconnectionproviders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 9.2.1 DriverManagerConnectionProvider . . . . . . . . . . . . . . . . . . . . . . . 135 9.2.2 C3P0ConnectionProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 9.2.3 HikariConnectionProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 9.2.4 DatasourceConnectionProvider . . . . . . . . . . . . . . . . . . . . . . . . . 137 9.2.5 Connectionreleasemodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 9.3 Monitoringconnections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 9.3.1 Hibernatestatistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 9.3.1.1 Customizingstatistics . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 9.4 Statementlogging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 9.4.1 Statementformatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 CONTENTS 9.4.2 Statement-levelcomments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 9.4.3 Loggingparameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 9.4.3.1 DataSource-proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 9.4.3.2 P6Spy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 10. MappingTypesandIdentifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 10.1 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 10.1.1 Primitivetypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 10.1.2 Stringtypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 10.1.3 DateandTimetypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 10.1.4 Numerictypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 10.1.5 Binarytypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 10.1.6 UUIDtypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 10.1.7 Othertypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 10.1.8 Customtypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 10.2 Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 10.2.1 UUIDidentifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 10.2.1.1 Theassignedgenerator . . . . . . . . . . . . . . . . . . . . . . . . . . 166 10.2.2 ThelegacyUUIDgenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 10.2.2.1 ThenewerUUIDgenerator . . . . . . . . . . . . . . . . . . . . . . . . 167 10.2.3 Numericalidentifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 10.2.3.1 Identitygenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 10.2.3.2 Sequencegenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 10.2.3.3 Tablegenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 10.2.3.4 Optimizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 10.2.3.4.1 Thehi/loalgorithm . . . . . . . . . . . . . . . . . . . . . . . 174 10.2.3.4.2 Thedefaultsequenceidentifiergenerator . . . . . . . . . . . 176 10.2.3.4.3 Thedefaulttableidentifiergenerator . . . . . . . . . . . . . . 177 10.2.3.4.4 Thepooledoptimizer . . . . . . . . . . . . . . . . . . . . . . 178 10.2.3.4.5 Thepooled-looptimizer . . . . . . . . . . . . . . . . . . . . . 180 10.2.3.5 Optimizergain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 10.2.3.5.1 Sequencegeneratorperformancegain . . . . . . . . . . . . . 181 10.2.3.5.2 Tablegeneratorperformancegain . . . . . . . . . . . . . . . 182 10.2.3.6 Identifiergeneratorperformance . . . . . . . . . . . . . . . . . . . . . 182 11. Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 11.1 Relationshiptypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 11.2 @ManyToOne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 11.3 @OneToMany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 11.3.1 Bidirectional@OneToMany . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 11.3.2 Unidirectional@OneToMany . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 11.3.3 Orderedunidirectional@OneToMany . . . . . . . . . . . . . . . . . . . . . . . 195 11.3.3.1 @ElementCollection . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 CONTENTS 11.3.4 @OneToManywith@JoinColumn . . . . . . . . . . . . . . . . . . . . . . . . . 199 11.4 @OneToOne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 11.4.1 Unidirectional@OneToOne . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 11.4.2 Bidirectional@OneToOne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 11.5 @ManyToMany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 11.5.1 Unidirectional@ManyToMany . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 11.5.2 Bidirectional@ManyToMany . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 11.5.3 The@OneToManyalternative . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 12. Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 12.1 Singletable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.2 Jointable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 12.3 Table-per-class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 12.4 Mappedsuperclass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 CONTENTS i Publisher: VladMihalcea Jupiter9/27 900492Cluj-Napoca Romania [email protected] Copyright©2015VladMihalcea All rights reserved. No part of this publication may be reproduced, stored, or transmitted in any form or by any means — electronic, mechanical, photocopying, recording, or otherwise — without thepriorconsentofthepublisher. Manyofthenamesusedbymanufacturersandsellerstodistinguishtheirproductsaretrademarked. Whereversuchdesignationsappearinthisbook,andwewereawareofatrademarkclaim,thenames havebeenprintedinallcapsorinitialcaps. While every precaution has been taken in the preparation of this book, the publisher and author assume no responsibility for errors and omissions, or for any damage resulting from the use of the information contained herein. The book solely reflects the author’s views. This book was not financially supported by any relational database system vendors mentioned in this work and no databasevendorhasverifiedthecontent. Coverdesign: [email protected] Coverphoto: CarlosZGZ¹-CC01.0² ¹https://www.flickr.com/photos/carloszgz/19980799311/ ²https://creativecommons.org/publicdomain/zero/1.0/