P. 1
2.16_20.TD09_JPA_best_practices2

2.16_20.TD09_JPA_best_practices2

|Views: 267|Likes:
Published by osman uygar köse

More info:

Published by: osman uygar köse on Jan 19, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/12/2011

pdf

text

original

Sections

  • Agenda
  • Catalog Java EE Application
  • Catalog Spring JPA Application
  • Container vs Application Managed
  • Level1 and Level2 caches
  • Entity Lifecycle
  • Entity Lifecycle Illustrated – The Code
  • Scope of Identity
  • Persistence Context
  • Declarative Transaction Management Example
  • AuditServiceBean
  • Declarative Transaction Management Example 2
  • Persistence Provider PC Transaction Features
  • Conversation with detached entity
  • Types of Persistence Context
  • Conversation with Exented Persistence Context
  • Persistence Context Micro Benchmark
  • Concurrency and Persistence Context
  • Optimistic versus Pessimistic Concurrency
  • Preventing Parallel Updates – 1
  • Preventing Stale Data
  • Preventing Parallel Updates – 2
  • L2 cache shared across transactions and users
  • Second-level Cache
  • L2 Cache
  • JPA 2.0 Shared Cache API
  • EclipseLink Caching Architecture
  • EclipseLink Extensions - L2 Caching
  • EclipseLink Mapping Extensions Type=
  • OpenJPA L2 Caching
  • Maintaining Relationship
  • Example – Domain Model
  • Navigating Relationships
  • Using Cascade
  • Database design Basic foundation of performance
  • Normalization
  • Mapping Inheritance Hierarchies
  • Single Table Per Class
  • Joined Subclass
  • Table Per Class
  • vertical partitioning
  • Vertical partitioning
  • Scalability: Sharding - Application Partitioning
  • Know what SQL is executed
  • MySQL Query Analyser
  • Query Types – 1
  • Query Types – 2
  • Flush Mode
  • Transactions

Java Persistence API

:
Best Practices
Carol McDonald Java Architect
1

Agenda

>Entity Manager >Persistence Context >Entities >Schema & Queries >Transaction
2

EntityManager API for managing entities
EntityManager

set of entities managed by Entity Manager

Servlets EJBs Java app

persist() remove() refresh() merge() find() createQuery() contains() flush()

createNamedQuery()Persistence

Context

3

Catalog Java EE Application
Registration Application
Managed Bean

Entity Class

Item

DB

ManagedBean

Catalog Session Bean

JSF Components

4

createQuery ("select i from Item as i"). } } 5 . return items.S t a t e l e s s S e s s io n B e a n A n n o t a t io n EJB EntityManager Example D e p e n d e n c y In j e c t io n @Stateless public class Catalog implements CatalogService { @PersistenceContext(unitName=”PetCatalogPu”) EntityManager em.setMaxResults(batchSize). List<Item> items= q. @TransactionAttribute(NOT_SUPPORTED) public List<Item> getItems(int firstItem. q.getResultList().setFirstResult(firstItem). int batchSize) { Query q = em. q.

Catalog Spring JPA Application Registration Application Managed Bean Entity Class Item DB ItemController Catalog Spring Bean JSF Components Spring Framework 6 .

return items. } 7 . @Transactional(readOnly=true) public List<Item> getItems(int firstItem.getResultList().Spring with JPA Component Stereotype Spring transactions use aop @Repository @Transactional public class CatalogDAO implements CatalogService { @PersistenceContext(unitName="PetCatalogPu") private EntityManager em. q.setFirstResult(firstItem).createQuery("select object(o) from Item as o"). List<Item> items= q.setMaxResults(batchSize).int batchSize) { Query q = em. q.

Seam component) • Injected into application • Automatically closed • JTA transaction – propagated Application managed entity managers > Used outside of the JavaEE 5 platform > Need to be explicitly created ● Persistence.createEntityManagerFactory() > RESOURCE_LOCAL transaction – not propagated > Need to explicitly close entity manager 8 . Spring Bean.Container vs Application Managed Container managed entity managers (EJB.

Agenda >Entity Manager >Persistence Context >Entities >Queries >Transaction 9 .

Persistence Context • Persistence context acts as a first level cache for entities • Two types of persistence context > Transaction scoped > Extended scoped set of entities managed by Entity Manager EntityManager persist() remove() refresh() merge() find() createQuery() contains() flush() persistence context createNamedQuery()Persistence Context 10 .

Source:http://weblogs.Level1 and Level2 caches Persistence Context is a Level 1 cache Transaction Transaction Transaction Persistence Context (EntityManager) Persistence Context (EntityManager) Persistence Context (EntityManager) L2 Cache (Shared Cache) Entity managers for a specific PersistenceUnit on a given Java Virtual Machine (JVM™) The terms “Java Virtual Machine” and “JVM” mean a Virtual Machine for the Java™ Platform.java.net/blog/guruwons/ archive/2006/09/understanding_t.html 11 .

Entity Lifecycle new() New Entity Detached Entity Updates PC ends persist() Persistence Context Managed Entity Managed Managed Entity Entity Merge() find() Transaction commit Guaranteed Scope of Object Identity only one manage entity in PC represents a row remove() Removed Entity 12 .

Order order) { OrderLine orderLine = new OrderLine(order. Managed entity } Detached entity } 13 .Entity Lifecycle Illustrated – The Code @Stateless public ShoppingCartBean implements ShoppingCart { New entity @PersistenceContext EntityManager entityManager. return (orderLine). product). Persisten context public OrderLine createOrderLine(Product product . entityManager.persist(orderLine).

OrderLine orderLine2 =entityManager. orderLine.Scope of Identity @Stateless public ShoppingCartBean implements ShoppingCart { @PersistenceContext EntityManager entityManager. (orderLine == orderLine2) // TRUE return (orderLine).persist(orderLine).getId())). product).find(OrderLine. Persistence context public OrderLine createOrderLine(Product product. } Multiple retrievals of the same object return references to the same object instance } 14 .Order order) OrderLine orderLine = new OrderLine(order. entityManager.

Persistence Context • Two types of persistence context • Transaction scoped > Used in stateless components > Typically begins/ends at request entry/exit points respectively • Extended scoped persistence context 15 .

Persistence Context Propagation @Stateless public class ShoppingCartBean implements ShoppingCart { @EJB InventoryService inv.updateInventory(Product p) } } Persistence context 16 . public void checkout(Item i. ord. @EJB OrderService ord.createOrder(item). Product p) { inv.

. .Persistence Context Propagation @Stateless public class OrderServiceBean implements OrderService { @PersistenceContext EntityManager em1. public void updateInventory(Product p) { Product product = em2.. } } @Stateless public class InventoryServiceBean implements InventoryService { @PersistenceContext EntityManager em2. public void createOrder(Item item) { em1.persist(new Order(item)). } 17 .merge(p).

Create Order Order Service PC TX_REQUIRED 18 . Update Inventory Inventory Service PC TX_REQUIRED TX_REQUIRED Transaction Attributes 2.Declarative Transaction Management Example Check Out New Persistence Context Persistence Context Propagated Shopping Cart PC 1.

em. } 19 .AuditServiceBean @Stateless public class AuditServiceBean implements AuditService { @PersistenceContext private EntityManager em. String action) { LogRecord lr = new LogRecord(id.persist(lr). action). NEW PC ! @TransactionAttribute(REQUIRES_NEW) public void logTransaction2(int id.

log transaction Audit Service PC2 REQUIRES_NEW NEW PC ! 20 .Declarative Transaction Management Example 2 Check Out New Persistence Context Persistence Context Propagated Shopping Cart REQUIRED PC 1. Update Inventory Inventory Service REQUIRED PC Transaction Attributes 2.

Persistence Provider PC Transaction Features • Attribute-level change tracking • Only the minimal updates are sent to the database • Orders INSERT. UPDATE and DELETE statements • Minimizes database interactions • EntityManager flush SQL prior to commit 21 .

Conversation with detached entity Conversation request response transaction-scoped persistence context Persistence Context Managed Entity Managed Managed Entity Entity request Detached Entity Detached Entity response transaction-scoped persistence context Persistence Context Managed Entity Managed Managed Entity Entity merge() 22 .

Conversation with detached entity @Stateless public ShoppingCartBean implements ShoppingCart { @PersistenceContext EntityManager entityManager.Order order) { OrderLine orderLine = new OrderLine(order. Managed entity return (orderLine). product). entityManager. return orderLine2. } } Managed entity 23 . } Detached entity public OrderLine updateOrderLine(OrderLine orderLine){ OrderLine orderLine2 =entityManager. public OrderLine createOrderLine(Product product.persist(orderLine).merge(orderLine)).

Types of Persistence Context • Persistence Context > lifetime maybe transaction-scoped or extended • Transaction-scoped persistence context • Extended persistence context > spans multiple transactions 24 .

Conversation with Exented Persistence Context Conversation request response request response extended persistence context Persistence Context Managed Entity Managed Entity Managed Entity 25 .

add(li).persist(order). //create and cache order public void createOrder(String itemId) { //order remains managed for the lifetime of the bean Order order = new Order(cust). Managed entity } public void addLineItem(OrderLineItem li){ order. em.Extended Persistence Context @Stateful public class OrderMgr { //Specify that we want an EXTENDED @PersistenceContext(type=PersistenceContextType. //Cached order private Order order.lineItems.EXTENDED) EntityManager em. } Managed entity 26 .

} @TransactionAttribute(NOT_SUPPORTED) public void addEmployee(int empId){ emp = em.add(emp).Extended Persistence Context @Stateful public class DeptMgr { @PersistenceContext(type=PersistenceContextType.find(Employee.class. emp. dept. private Department dept.EXTENDED) EntityManager em.getEmployees().find(Department.empId).find(Department. } @Remove @TransactionAttribute(REQUIRES_NEW) public void endUpdate(int deptId) { dept = em. } 27 .deptId).deptId).setDepartment(dept).class.class. @TransactionAttribute(NOT_SUPPORTED) public void getDepartment(int deptId) { dept = em.

Persistence Context-Transactional vs. Extended
@Stateless public class

OrderMgr

implements OrderService {

@PersistenceContext EntityManager em; public void addLineItem(OrderLineItem li){ // First, look up the order. Order order = em.find(Order.class, orderID); order.lineItems.add(li); }

look up the order

@Stateful
public class

OrderMgr

implements OrderService {

@PersistenceContext(type = PersistenceContextType.EXTENDED)) EntityManager em; Managed entity // Order is cached Order order public void addLineItem(OrderLineItem li){ No em.find invoked // No em.find invoked for the order object order.lineItems.add(li); }
28

Persistence Context Micro Benchmark
• Micro benchmark with lots of lookups • Persistence context is caching entities
120% 100% 80% 60% 40% 20% 0%

Extended Transactional

tx/sec
Source: Internal benchmarks
29

SEAM Conversations
@Name("shopper") @Scope(CONVERSATION) public class BookingManager { @In EntityManager entityManager; private Booking booking; @Begin public void selectHotel(Hotel selectedHotel){ hotel = em.merge(selectedHotel); } @End public void confirm() { em.persist(booking); } }

SEAM injected

SEAM conversation
30

Concurrency and Persistence Context
User 1 transaction Persistence Context 1 same entity
Entity Manager Entity Manager

User 2 transaction Persistence Context 2

Object Identity only one manage entity in PC represents a row

Data source
31

Optimistic versus Pessimistic Concurrency • Optimistic Concurrency > Pros—No database locks held > Cons—Requires a version attribute in schema ● user or app must refresh and retry failed updates > Suitable when application has few parallel updates • Pessimistic Concurrency > Lock the row when data is read in ● database locks the row upon a select ● (SELECT . . .0 (vendor specific).0 > Suitable when application has many parallel updates 32 . supported in JPA 2. FOR UPDATE [NOWAIT]) > Pros—Simpler application code > Cons—Database locks ● limits concurrent access to the data = scalability ● May cause deadlocks ● Not in JPA 1.

long. Timestamp Used by persistence manager .. merged or acquiring a write lock OptimisticLockException if mismatch Not used by the application! 33 . Integer.Preventing Parallel Updates use @Version for optimistic locking public class Employee { @ID int id. Results in following SQL “UPDATE Employee SET .... short. Long. Short. . Can be int. version = version + 1 WHERE id = ? AND version = readVersion” Version Updated when transaction commits.. @Version int version.

version == 1 in db? tx2.begin().version == 2 in db //Joe's rate is $11 //Joe's current rate is $9 if(e1. //Joe's rate is $14 //OptimisticLockException 34 . tx1. e1.begin().Preventing Parallel Updates – 1 tx1.raise(2).commit().getRate() < 10) e1.version == 1 e1 = findPartTimeEmp(5). //e1. //Joe's employee id is 5 //e1.commit(). //Joe's current rate is $9 tx2. Time //e1.version == 1 e1 = findPartTimeEmp(5). //Joe's employee id is 5 //e1.raise(5).

WRITE). 35 . perform a version check on entity before commit OptimisticLockException if mismatch perform a version check on entity OptimisticLockException if mismatch and increment version before commit entityManager. READ).0 • Perform read or write locks on entities • Prevents non-repeatable reads in JPA entityManager.lock( entity.Preventing Stale Data JPA 1.lock( entity.

raiseByTenPercent(). d1 = e1.begin(). if(d1's name is “Engrg”) e1.commit().lock(d1.version in db tx2. e1 = findEmp(eId). //d1's original name is //”Engrg” d1.Preventing Stale Data tx1.setName(“MarketEngrg”). em. Time //Check d1.commit(). READ).begin(). //e1 gets the raise he does //not deserve //Transaction rolls back 36 . d1 = findDepartment(dId).getDepartment(). tx2. tx1.

37 . //d1's original name is //”Engrg” d1. em. tx2.commit(). d1 = findDepartment(dId). if(d1's name is “Engrg”) e1. d1 = e1. //version++ for d1 em.commit().lock(d1. tx1. e1 = findEmp(eId).Preventing Parallel Updates – 2 Write lock prevents parallel updates tx1.getDepartment().flush().begin().setName(“MarketEngrg”).raiseByTenPercent().begin(). //tx rolls back Time tx2. WRITE).

JPA 2.0 also supports pessimistic locks • JPA 2. FOR UPDATE ) 38 . JPA 2. .0 only supported optimistic locking.0 Locks • JPA1. .0 LockMode values : > > > > • Multiple places to specify lock OPTIMISTIC (= READ) OPTIMISTIC_FORCE_INCREMENT (= WRITE) PESSIMISTIC database locks the row PESSIMISTIC_FORCE_INCREMENT (SELECT .

acctId.lock(acct.100).find(Account.100).getBalance().class. Lock after read. acct. acctId). could cause bottlenecks. deadlock 39 . // Decide to withdraw $100 so lock it for update em.class.0 Locking //Read then lock: Account acct = em. could cause OptimisticLock Exception //Read and lock: Account acct = em.PESSIMISTIC).setBalance(balance .getBalance().setBalance(balance . acct. int balance = acct. Locks longer. risk stale. PESSIMISTIC).find(Account. // Decide to withdraw $100 (already locked) int balance = acct.JPA 2.

JPA 2. acctId). PESSIMISTIC).refresh(acct. deadlock ●Lock later : risk stale data for update.setBalance(balance . // Decide to withdraw $100 .class. int balance = acct.lock and refresh em.0 Locking Trade-offs: ●lock earlier : risk bad scalability.find(Account.100). acct. “right” approach depends on requirements 40 . get optimistic lock exception ● // read then lock and refresh Account acct = em.getBalance().

L2 cache shared across transactions and users Putting it all together User Session User Session User Session Persistence Context (EntityManager) Persistence Context (EntityManager) Persistence Context (EntityManager) L2 Cache (Shared Cache) (EntityManagerFactory) Entity managers for a specific PersistenceUnit on a given Java Virtual Machine (JVM™) 41 .

provide second-level cache(s) 42 .0 does not specify L2 support > Java Persistence API 2.Hibernate. entities not found in persistence context..Second-level Cache • L2 Cache shares entity state across various persistence contexts > If caching is enabled. will be loaded from L2 cache. if found • Best for read-mostly classes • L2 Cache is Vendor specific > Java Persistence API 1..0 has basic cache operations > Most persistence providers-. EclipseLink. OpenJPA .

other queries go to database or query cache L2 Cache Data source 43 .L2 Cache User transaction 1 same entity not shared Persistence Context Persistence Context User transaction 2 Shared entity Entity Entity query that looks for a single object based on Id will go 1st to PC then to L2 cache.

L2 Caching • Pros: > avoids database access for already loaded entities ●faster for reading frequently accessed unmodified entities • Cons > memory consumption for large amount of objects > Stale data for updated objects > Concurrency for write (optimistic lock exception. or pessimistic lock) ●Bad scalability for frequent or concurrently updated entities 44 .

L2 Caching • Configure L2 caching for entities that are > read often > modified infrequently > Not critical if stale • protect any data that can be concurrently modified with a locking strategy > Must handle optimistic lock failures on flush/commit > configure expiration. for not modified tables 45 . refresh policy to minimize lock failures • Configure Query cache > Useful for queries that are run frequently with the same parameters.

Object pk). Object pk).JPA 2. // invalidates the class in the IdentityMap. public void evictAll(). // Invalidates all classes in the IdentityMap } 46 .0 Shared Cache API • entity cache shared across persistence unit > Accessible from EntityManagerFactory • Supports only very basic cache operations > Can be extended by vendors public class Cache { //checks if object is in IdentityMap public boolean contains(Class class. public void evict(Class class). // invalidates object in the IdentityMap public void evict(Class class.

EclipseLink Caching Architecture EntityManager EntityManager Factory EclipseLink caches Entities in L2. Hibernate does not L1 Cache PC Cache Server L2 Shared Cache Cache Coordination JMS (MDB) RMI CORBA IIOP 47 .

SYNC+NEW. size. coordination.L2 Caching • Default: Entities read are L2 cached • Cache Configuration by Entity type or Persistence Unit > You can disable L2 cache • Configuration Parameters > Cache isolation. RMI. invalidation. … ● Mode: SYNC.EclipseLink Extensions . NONE 48 . INVALIDATE. RMI-IIOP. type.refreshing > Coordination (cluster-messaging) ● Messaging: JMS. expiration.

expiry=600000. alwaysRefresh=true. disableHits=true. coordination ● Cache usage and refresh query hints 49 .EclipseLink Mapping Extensions Type= @Entity @Table(name="EMPLOYEE") @Cache ( type=CacheType.WEAK.. coordinationType=INVALIDATE_CHANGED_OBJECTS ) public class Employee implements Serializable { .. isolated=false. cache usage. } Full: objects never flushed unless deleted or evicted weak: object will be garbage collected if not referenced =true disables L2 cache @Cache ● type. refresh. expiry.isolated. size.

disk memory. disk clustered clustered Read-only Yes Yes Yes Yes Yes Read-write Yes Yes Transactional 50 .Hibernate L2 Cache • Hibernate L2 cache is not configured by default • Hibernate L2 does not cache Entities. OSCache. Hibernate caches Id and state • Hibernate L2 cache is pluggable > EHCache. SwarmCacheProvider (JVM) > JBoss TreeCache Cluster > Can plug in others like Terracotta Cache Concurrency Strategy Cache EHCache OSCache SwarmCache JBoss Cache Type memory.

sf..optional configuration file parameter --> not configured by default net.configurationResourceName=/name_of_configuration_resource @Entity @Cache(usage = CacheConcurrencyStrategy..Hibernate L2 Cache <!-. } Cache Concurrency Strategy must be supported by cache provider 51 . .NONSTRICT_READ_WRITE) public Class Country { private String name.ehcache.

such as Tangosol’s Coherence product several cache eviction strategies: > Time-to-live settings for cache instances @Entity @DataCache(timeout=5000) public class Person { ... } 52 .OpenJPA L2 Caching • OpenJPA L2 caches object data and JPQL query • • • • results Updated when data is loaded from database and after changes are successfully committed For cluster caches are notified when changes are made Can plug in implementations.

Agenda >Entity Manager >Persistence Context >Entities >Schema and Queries >Transaction 53 .

Maintaining Relationship • Application bears the responsibility of maintaining relationship between objects deptA.add(e3).getEmployees(). Before Employee1 After Employee1 Department A Employee2 Department A Inconsistent! Department B Employee2 Department B Employee3 Employee3 54 .

. @ManyToOne(fetch=LAZY) private Department dept. . private String lastName... private String firstName. private String name.. ... @OneToMany(mappedBy = "dept". } @Entity public class Department { @Id private int id. fetch=LAZY) private Collection<Employee> emps = new . } 55 ..Example – Domain Model @Entity public class Employee { @Id private int id.

e...persist(d). //Reverse relationship is not set em.size()..) { Employee e = new Employee(.). Department d = new Department(1. .getEmployees().Example – Managing Relationship INCORRECT public int addNewEmployee(..persist(e). } 56 .setDepartment(d).)... return d. em.

return d. e..).persist(e)..getEmployees().).Example – Managing Relationship CORRECT public int addNewEmployee(.add(e).size()..persist(d).getEmployees().) { Employee e = new Employee(. } 57 . em. Department d = new Department(1.. .. em..setDepartment(d). d.

Navigating Relationships Data fetching strategy • EAGER – immediate • LAZY – loaded only when needed • LAZY is good for large objects and/or with relationships with deep hierarchies 58 .

.id.. .id.deptId = ? // N times 59 .. FROM Employee e WHERE e.Lazy loading and JPA @Entity public class Department { @Id private int id. FROM Department d // 1 time SELECT e.. } • Default FetchType is LAZY for 1:m and m:n relationships > benefits large objects and relationships with deep hierarchies • However for use cases where data is needed can cause n+1 selects • LAZY – N + 1 problem: SELECT d.. . @OneToMany(mappedBy = "dept") private Collection<Employee> emps ...

.. @OneToMany(mappedBy = "dept".Lazy loading and JPA @Entity public class Department { @Id private int id.employees")}) public class Department{ .... use Join Fetch in a query: @NamedQueries({ @NamedQuery(name="getItEarly".. } 60 . fetch=EAGER) private Collection<Employee> employees . . } Can cause Cartesian product • Relationship can be Loaded Eagerly > But if you have several related relationships. could load too much ! OR • Temporarily override the LAZY fetch type. query="SELECT d FROM Department d JOIN FETCH d.

logging.xml file:<property name="toplink.level" value="FINE"> • Test run use cases and examine the SQL statements > optimise the number of SQL statements executed! > only retrieve the data your application needs! • Lazy load large (eg BLOB) attributes and relationships that are not used often • Override to Eagerly load in use cases where needed 61 .Lazy loading and JPA • Capture generated SQL > persistence.

Navigating Relationships Detached Entity • Accessing a LAZY relationship from a detached entity > If not loaded . Persistence Context Managed Entity 62 .getEmployees().size(). Causes an exception • Solutions: > Use JOIN FETCH > Or Set Fetch type to EAGER > Or Access the collection before entity is detached: d.

MERGE. REMOVE. PERSIST. ALL with deep hierarchies > If want to do it. limit the scope 63 . REFRESH > The default is do nothing • Avoid MERGE.Navigating Relationships Data fetching strategy • Cascade specifies operations on relationships > ALL.

Using Cascade @Entity public class Employee { Employee @Id private int id. private String lastName.. fetch=LAZY) private Collection<Employee> emps = new . private String firstName.. } 64 .... . . X } @Entity public class Department { DepartmentCode @Id private int id.. @OneToMany private Collection<DepartmentCode> codes. @OneToMany(mappedBy = "dept" cascade=ALL.. fetch=LAZY) Department private Department dept. cascade=ALL @ManyToOne(cascade=ALL. private String name.

Agenda >Entity Manager >Persistence Context >Entities >Schema and Queries >Transaction 65 .

l m em or   l di  ess  y.i r i ar  nfequenty  l used  um ns nt a  col i o  separ e  at one­o­ t one abl t e • U se  good ndexi i ng > I ndexes  Speed  Q uer up  ys > I ndexes  ow   sl dow n  pdat U es > I ndex  um ns r col fequenty  l used n  uer W her cl i Q y  e  ause 66 .Database design Basic foundation of performance • Sm alert es  l  abl use ess  sk.can  ve  t   gi beter peror ance f m > U se  sm al dat t as  l  a ypes  possi e as  bl > use  sm al  i ar key  possi e as  lprm y  as  bl > Veri   tton: tcalParii ●spltl ge.

• However Normalized database causes joins for queries > Queries maybe slower > Normalize then maybe De-normalize frequently read columns and cache them 67 .Normalization • Normalization Eliminates redundant data > updates are usually faster. ●there's less data to change.

Mapping Inheritance Hierarchies Employee --------------------------int id String firstName String lastName Department dept PartTimeEmployee ------------------------ FullTimeEmployee ----------------------- int rate double salary 68 .

Single Table Per Class Benefits @Inheritance(strategy=SINGLE_TABLE) • Simple EMPLOYEE --------------------------• No joins required ID Int PK. varchar(30) • Requires columns corresponding to subclasses' state to be null • Table can have too many columns > Larger tables= more data. can have negative affects on performance – 69 . double NULL. int FK. varchar(255). int NULL. > can be fast for Queries Drawbacks • Not normalized > Wastes space FIRSTNAME LASTNAME DEPT_ID RATE SALARY DISCRIM varchar(255).

RATE int NULL FULLTIMEEMPLOYEE ID int PK FK. SALARY double NULL hierarchies. varchar(255). Benefits • Normalized database > Better for storage • Database view same as domain model • Easy to evolve domain model Drawbacks • Queries cause joins > Slower queries > Poor performance for deep PARTTIMEEMPLOYEE ID int PK FK.Joined Subclass @Inheritance(strategy=JOINED) EMPLOYEE ID FIRSTNAME LASTNAME DEPT_ID int PK. varchar(255). polymorphic queries and relationships 70 . int FK.

Table Per Class Benefits • No need for joins to read entities of same type > Faster reads @Inheritance(strategy=TABLE_PER_CLASS) Drawbacks • Not normalized > Wastes space PARTTIMEEMPLOYEE ID int PK. int FK. RATE int NULL FULLTIMEEMPLOYEE ID FIRSTNAME LASTNAME DEPT_ID SALARY int PK. FIRSTNAME varchar(255). LASTNAME varchar(255). varchar(255). varchar(255). double NULL • Polymorphic queries cause union (all employees) > Poor performance • This strategy is not mandatory 71 . DEPT_ID int FK.

sN   U sTL kE iX lT   .a RO  yV(T d_A5  inR0N saC)U pmH L leAN .a RO  yV(T d_A5  inR0N saC)U pmH L leAN . EI Nn Go ID N CTuI RAsn EBtf ALoo TEm  E e(  Cr  iN u T sI  eNN rTU _ L dO . RO  V(T eA8  mR0N aC)U iH L lAN .E )   ( UIe NNm IDa QEi UXl )EB  =.eX  sT it  nsN t U eTL rE . EM Ny GI IS NA • limit number of columns per table • split large.nRT  c(  pe2N r )U oC L vHN iAO .oRT  d(  pe7N o )U sC L tHN cAO .sH L   RO aV(T dA8  rR0N eC)U AN .tX  uT sr  ieN g U nTL aE .tX  uT sr  ieN g U nTL aE .R(d  Yu) P s RKe IEr MY_ A i .E ek  X(si FTitl U nss LKt._A2   nR5N faC)U imH L reAN s RO tV(T .oRO  r(T pd4  a 1N sC)U wAN H L .R(d  Yu) P s RKe IEr MY_ A i .eX  sT it  nsN t U eTL rE .nRT  c(  pe2N r )U oC L vHN iAO .vertical partitioning CTu  RAs( EBt ALo TEm E e  Cr  iN NT u TAC sI UR eNNTE rTUOM _ L_E dO IN .sH L   RO aV(T dA8  rR0N eC)U AN .R(d  Yu) P s RKe IEr MY_ A i .) TYrs Ee  )EM  =.E  X bT i  oN  U TL . RO  V(T eA8  mR0N aC)U iH L lAN .nR5N  aC)U lmH L aeAN s RO tV(T _A2  . EI Nn Go ID N Frequently referenced CTu( RAs EBt ALo TEm E e  Cr  iN NT u TAC sI UR eNNTE rTUOM _ L_E dO IN . TEXT data .sN   U sTL kE iX lT   .oRT  d(  pe7N o )U sC L tHN cAO Less Frequently referenced.nR5N  aC)U lmH L aeAN s RO tV(T _A2  .E  X bT i  oN  U TL .E )   ( UIe NNm IDa QEi UXl )EB  =.oRO  r(T pd4  a 1N sC)U wA L HN .V(T  A3  cR0N iC)U tH L yAN  RO . infrequently used columns into a separate table 72 .V(T  A3  cR0N iC)U tH L yAN  RO ._A2   nR5N faC)U imH L reAN s RO tV(T .

} 73 > split large. infrequently used columns into a separate table . String email. @OneToOne(fetch=LAZY) CustomerInfo info. String name. @OneToOne(mappedBy= "CustomerInfo") Customer customer. } @Entity public class CustomerInfo { int userid. String interests.Vertical partitioning @Entity public class Customer { int userid. String password.

Scalability: Sharding .Application Partitioning Web/App Servers Sharding Architecture Cust_id 1-999 Cust_id 1000-1999 Cust_id 2000-2999 > Sharding =Horizontal partitioning ●Split table by rows into partitions 74 .

Know what SQL is executed • Capture generated SQL: persistence.logging.xml file: <property name="toplink.level" value="FINE"> • Find and fix problem SQL: > Watch for slow Queries ● use the MySQL slow query log and use Explain – Can reveal problems such as a missing Indexes > Watch for Queries that execute too often to load needed data > Watch for loading more data than needed 75 .

run time 76 .MySQL Query Analyser Find and fix problem SQL: • how long a query took • results of EXPLAIN statements Its not just slow running queries that are a problem. Sometimes its SQL that executes a lot that kills your system • Historical and real-time analysis > query execution counts.

Agenda >Entities >Entity Manager >Persistence Context >Queries >Transaction 77 .

empId LIKE '” + id + “'”). q = em.”). better to use with named q = em.Query Types – 1 • Named query > Like findByXXXX() from EntityBeans > Compiled by persistence engine > Created either with @NamedQuery or externalized in orm. parameters 78 . id)...empId LIKE ':id'”).setParameter(“id”. > Beware of SQL injection.xml • Dynamic query > Created dynamically by passing a query string to EntityManager • Query query = em.createQuery(“select . q.createQuery(“select e from Employee e WHERE ” GOOD + “e.createQuery(“select e from Employee NOT GOOD e WHERE ” + “e.

Query Types – 2 • Native query > Leverage the native database querying facilities > Not portable – ties queries to database 79 .

Query q = em. //Newly added order will NOT visible List list = q.setFlushMode(FlushModeType. q. orderNumber).class.createNamedQuery(“findAllOrders”). default > COMMIT – flush only when a transaction commits > NEVER – need to invoke EntityManger. q. em.Flush Mode • Controls whether the state of managed entities are synchronized before a query • Types of flush mode flush //Assume JTA transaction Order order = em.flush() to 80 .persist(order).find(Order. > AUTO – immediate. orderNumber).setParameter(“id”.getResultList().COMMIT).

Agenda >Entities >Entity Manager >Persistence Context >Queries >Transaction 81 .

Transactions • Do not perform expensive and unnecessary operations that are not part of a transaction on log > Hurt performance > Eg. resource contention • Do not use transaction when browsing data > Create your own EntityManager as oppose to injected 82 . logging – disk write are expensive.

Carol McDonald Java Architect 83 83 .

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->