Accesul de înaltă performanță la nivelul de date necesită o mulțime de cunoștințe despre dispozitivul bazei de date, JDBC, JPA, Hibernate, iar acest post conține cele mai importante tehnici pe care le puteți utiliza pentru a optimiza aplicația dvs. enterprise.
1. Executarea expresiilor SQL
Dacă utilizați un cadru care generează expresii de pe fața dvs., trebuie să validați întotdeauna fiecare expresie pentru eficiență și performanță.
2. Managementul conexiunilor
Conexiunile la baza de date sunt scumpe, deci trebuie să utilizați întotdeauna mecanismul de conectare a conexiunilor.
Deoarece numărul de conexiuni este setat de capabilitățile clusterului bazei de date, trebuie să eliberați resursele de conectare cât mai repede posibil.
La reglarea performanței, trebuie să măsurați și să setați întotdeauna dimensiunea corectă a bazinului. Unelte precum FlexyPool vă pot ajuta să găsiți dimensiunea potrivită chiar dacă ați instalat aplicația pe un server de producție.
3. Batching JDBC
JDBC batching ne permite să trimitem mai multe expresii SQL într-o singură sesiune a conexiunii la baza de date. Beneficiul în performanță este semnificativ atât din partea conducătorului auto, cât și din partea bazei de date. PreparedStatements sunt candidați foarte potriviți pentru loturi, iar unele DBMS (de exemplu Oracle) acceptă loturi numai pentru PreparedStatements.
Din moment ce a introdus în API-ul JDBC pentru batchinga (de exemplu, PreparedStataement.addBatch și PreparedStatement.executeBatch), dacă generați manual expresia, trebuie să știți de la început dacă puteți utiliza un procedeu discontinuu sau nu. Cu Hibernare, puteți trece la dozării doar pur și simplu o setare în configurația.
Hibernate 5.2 oferă loturi la nivel de sesiune. care este o soluție și mai flexibilă în această privință.
4. Exprimarea cache-ului
Expresiile cache sunt una dintre cele mai puțin cunoscute optimizări de performanță pe care le puteți profita. În funcție de driverul JDBC, puteți cache-ul PreparedStatements atât din partea clientului (driver), cât și din baza de date (arbore de sintaxă sau chiar plan de execuție).
5. Identificatorii de hibernare
Utilizarea generatorului Hibernate IDENTITY nu este cea mai bună alegere, deoarece face imposibilă dozarea JDBC.
Generatorul TABLE este chiar mai rău, deoarece utilizează o tranzacție separată pentru a descărca un nou identificator, care poate încărca jurnalul de tranzacții și un bazin de conexiuni de la faptul că de fiecare dată când avem nevoie de un nou identificator va avea nevoie de o conexiune separată.
6. Alegeți corect tipurile de date pentru coloane
7. Relațiile relaționale
Hibernatul oferă multe tipuri de relații relaționare relaționate, dar toate sunt egale în termeni de eficiență.
Întotdeauna evitați asociațiile unidirecționale și @ManyToMany. Pentru colecții, este preferabilă asocierea bidirecțională @OneToMany.
Cu toate acestea, spre deosebire de solicitări, colecțiile sunt mai puțin flexibile, deoarece nu pot fi defalcate ușor în pagini. Din acest motiv, trebuie să vă întrebați întotdeauna dacă colecția este cu adevărat necesară. O interogare mapată entitate poate fi o alternativă mai bună în multe situații.
8. Moștenire
Când vine vorba de moștenire, diferențele dintre limbile orientate pe obiecte și bazele de date relaționale devin și mai evidente. JPA oferă SINGLE_TABLE. JOIN. și TABLE_PER_CLASS pentru moștenire la cartografiere și fiecare dintre aceste strategii are argumente pro și contra.
SINGLE_TABLE efectuează cea mai bună expresie din punctul de vedere al SQL, dar pierdem integritatea datelor din cauza imposibilității de a folosi constrângerile NOT NULL.
JOIN rezolvă problemele de integritate a datelor prin oferirea de expresii mai complexe. Până când nu utilizați interogări polimorfe sau asociații @OneToMany la tipuri de bază, această strategie funcționează bine. Puterea reală provine din asociațiile polimorfe @ManyToOne bazate pe modelul de strategie din partea laterală a stratului de acces la date.
TABLE_PER_CLASS ar trebui evitat deoarece această strategie generează expresii SQL ineficiente.
9. Dimensiunea contextului de persistență
Atunci când utilizați JPA și Hibernate, trebuie să țineți cont întotdeauna de dimensiunea contextului Persistență. Din acest motiv, nu ar trebui să-l umflați cu sute de entități controlate. Prin reducerea numărului de entități gestionate, obținem o îmbunătățire semnificativă a gestionării memoriei și mecanismul implicit de verificare murdară va funcționa mai eficient!
10. Descărcați numai ceea ce este cu adevărat necesar
Descărcarea unor cantități mari de date este probabil motivul numărul unu pentru problemele legate de performanța stratului de acces la date. Problema este că interogările pentru entități sunt folosite exclusiv, chiar și pentru operațiile de citire.
Proiecțiile DTO sunt mai potrivite pentru descărcarea vizualizărilor personalizate, în timp ce entitățile trebuie să fie descărcate numai atunci când fluxul de acțiuni logice de afaceri necesită schimbarea acestora.
Descărcarea EAGER este cea mai gravă și ar trebui să evitați anti-modelele, cum ar fi Open-Session în Vizualizare.
11. Caching-ul
Sistemele DBMS relate utilizează o mulțime de tampoane în memorie pentru a salva resursele de disc. Caching-ul bazei de date este deseori neglijat. Putem reduce în mod semnificativ timpul de răspuns prin setarea motorului bazei de date, astfel încât seturile de date de lucru să fie în memorie și să nu fie descărcate permanent de pe disc.
Caching-ul la nivel de aplicație nu este obligatoriu pentru multe aplicații enterprise. Caching-ul la nivel de aplicație poate reduce timpul de răspuns, oferind stocare secundară pentru citirea datelor atunci când baza de date este în curs de întreținere sau când apare o defecțiune gravă a sistemului.
Cache-ul de nivel 2 este foarte util pentru reducerea timpului de răspuns pentru o tranzacție de citire și scriere, în special cu arhitectura de replicare Master-Slave. În funcție de cerințe, Hibernate oferă următoarele strategii: READ_ONLY. NONSTRICT_READ_WRITE. Read_write. și TRANZACȚIONAL.
12. Controlul concurenței
Alegerea nivelului de izolare a tranzacțiilor este de o importanță capitală în ceea ce privește viteza și integritatea datelor. Pentru fire cu apeluri multiple, pentru a evita pierderea datelor actualizate, trebuie să utilizați un blocaj optimist sau un context de persistență EXTENDED.
13. Scalarea verticală și orizontală
Sistemele DBMS relate sunt bine dimensionate. Dacă Facebook. Twitter. Pinterest sau StackOverflow pot scala DBMS-ul lor, care este o șansă bună pentru a vă scala aplicația de întreprindere în conformitate cu cerințele afacerii.
Replicarea și segmentarea bazei de date sunt opțiuni foarte bune pentru creșterea lățimii de bandă și ar trebui să profitați din plin de aceste șabloane arhitecturale pentru a vă scala aplicația.
(Vizitata 358 ori, de 1 ori astazi)