2012-04-26 7 views
9

Sto assemblando una normale applicazione Java EE su jboss7 che utilizzerà JPA nel livello dati. Mi piacerebbe fare questa applicazione in modo che si ridimensiona con il carico. Mentre è abbastanza chiaro come scalare il livello web: creare più macchine e metterle dietro un sistema di bilanciamento del carico, scalare il livello dei dati è meno.Scaling e Clustering JPA

Posso probabilmente raggruppare il mio database (MySQL). Stil, che lascia lo strato JPA non selezionato. Idealmente, JPA scalerà usando cache di memoria (in cluster) supportata da MySQL.

Quando mi guardo intorno, tutte le informazioni relative al ridimensionamento JPA sembrano avere 3-4 anni. Le persone parlano di ehcache, memcached e infinispan. Non sono sicuro se questo è ancora attuale.

Qualcuno può dirmi lo stato dell'arte nel clustering e nel ridimensionamento EE Java, soprattutto nel livello dati.

+0

Ho ottenuto risposte sorprendenti da Piotr e James.È un peccato che SOF mi lasci solo contrassegnare una come risposta corretta. Grazie ad entrambi. Successivamente, ho bisogno di scoprire cosa c'è di meglio nel caching: perché dovrei usare qualsiasi cosa tranne memcached. – Raj

risposta

6

Varie strategie di memorizzazione nella cache sono ancora il modo per ridimensionare JPA/Hibernate (in pratica hai chiamato le opzioni più popolari nella tua domanda). Nulla di straordinario è accaduto da 4-5 anni in questo campo, per quanto ne so. Un'altra opzione che non hai menzionato è JBoss Cache. Quindi la Second Level Cache per JPA/Hibernate regola ancora in quest'area.

Perché non ci sono progressi qui? La mia ipotesi è che prima di tutto le persone, che hanno bisogno di un'applicazione scalabile, tendono a ignorare JPA e Hibernate nelle aree in cui sono necessarie prestazioni elevate. Di solito le persone vanno con SQL vestito con gli helper JDBCTemplate di Spring Framework e la gestione delle transazioni. Quindi la scalabilità è la questione delle capacità del database in quest'area.

L'altra tendenza è utilizzare i database No-SQL. C'è un sacco di soluzioni: MongoDB, CouchoDB, Cassandra, Redis, solo per citarne alcuni. Questi sono di solito Google BigTable come gli archivi a valore-chiave (questa è una semplificazione eccessiva, ma è più o meno l'idea alla base di tale approccio) e si ridimensionano all'inferno, se accettate i loro limiti (le relazioni non sono più gestite facilmente, ecc.).

+0

Ciao Piotr, grazie per la tua risposta. Sono interessato a saperne di più sugli helper dei template JDBC. Ci sono dei buoni suggerimenti? – Raj

+0

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html è una buona lettura. Ci sono anche libri, "Spring in Action" è ok –

+0

Grazie per il link, Piotr. – Raj

6

Ci sono molte soluzioni, le due principali categorie di soluzioni sono:

  • ridimensionamento del database
  • utilizzando una cache in cluster per ridurre il carico del database

EclipseLink supporta il partizionamento dei dati per sharding dati attraverso una serie di istanze di database,

vedere: http://java-persistence-performance.blogspot.com/2011/05/data-partitioning-scaling-database.html

È inoltre possibile utilizzare MySQL Cluster,

vedi: http://www.mysql.com/products/cluster/

Oracle TopLink griglia fornisce il supporto EclipseLink JPA per l'integrazione con Oracle Coherence come una cache distribuita,

vedi: http://www.oracle.com/technetwork/middleware/ias/tl-grid-097210.html

La cache di EclipseLink supporta il clustering tramite il coordinamento della cache,

vedi: http://wiki.eclipse.org/EclipseLink/Examples/JPA/CacheCoordination

+0

Ciao James, grazie della risposta. Vogliamo fare entrambe le cose per ridimensionare ed evitare ogni singolo punto di errore. In tutte le mie ricerche, memcached sembra "best of breed": ha un ampio supporto e sembra essere in grado di fare ciò che qualsiasi altra cache farebbe. Cosa ne pensi? – Raj