2013-07-22 10 views
11

Mi chiedo che cosa sarebbe un numero ragionevole per il mio connection.pool_size? a quali aspetti è collegato? Inoltre, è necessario sapere come testare l'applicazione una volta definita una dimensione.Come trovare una dimensione ragionevole per una piscina di connessione al database e come verificarlo?

La mia applicazione sta per essere utilizzato da almeno 100 utenti contemporaneamente, ha più di 20 tavoli nel suo database. Il mio database è MySQL e almeno 12 sistemi utilizzano la mia applicazione contemporaneamente. Per favore fatemi sapere se avete bisogno di saperne di più.

Ho anche trovato il seguente, che aiuta a definire la dimensione del pool di connessione, ma ancora non è sicuro che il numero è ragionevole.

Hibernate's own connection pooling algorithm is, however, quite rudimentary. 
    It is intended to help you get started and is not intended for use in a production 
    system, or even for performance testing. You should use a third party pool for 
    best performance and stability. Just replace the hibernate.connection.pool_size 
    property with connection pool specific settings. This will turn off Hibernate's 
    internal pool. For example, you might like to use c3p0. 

    connection.pool_size indicates the maximum number of pooled connections. So it is 
    better to keep it at a logical count. It depends on your application and DB how 
    much it can handle. 10 is a reasonable count that will typically used as it is 
    sufficient for most cases. 

mio HibernateUtil è come seguendo

import org.hibernate.HibernateException; 
    import org.hibernate.Session; 
    import org.hibernate.SessionFactory; 
    import org.hibernate.cfg.Configuration; 
    import org.hibernate.service.ServiceRegistry; 
    import org.hibernate.service.ServiceRegistryBuilder; 

    public class HibernateUtil { 

     private static ServiceRegistry serviceRegistry; 
     private static final ThreadLocal<Session> threadLocal = new ThreadLocal(); 
     private static SessionFactory sessionFactory; 
     private static SessionFactory configureSessionFactory() { 
      try { 
       Configuration configuration = new Configuration(); 
       configuration.configure(); 
       serviceRegistry = new 
ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 
       sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
       return sessionFactory; 
      } catch (HibernateException e) { 
       System.out.append("** Exception in SessionFactory **"); 
       e.printStackTrace(); 
      } 
      return sessionFactory; 
     } 

     static { 
     try { 
      sessionFactory = configureSessionFactory(); 
     } catch (Exception e) { 
      System.err.println("%%%% Error Creating SessionFactory %%%%"); 
      e.printStackTrace(); 
     } 
     } 

     private HibernateUtil() { 
     } 

     public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
     } 

     public static Session getSession() throws HibernateException { 
     Session session = threadLocal.get(); 

     if (session == null || !session.isOpen()) { 
      if (sessionFactory == null) { 
      rebuildSessionFactory(); 
      } 
      session = (sessionFactory != null) ? sessionFactory.openSession() : null; 
      threadLocal.set(session); 
     } 

     return session; 
     } 

     public static void rebuildSessionFactory() { 
     try { 
      sessionFactory = configureSessionFactory(); 
     } catch (Exception e) { 
      System.err.println("%%%% Error Creating SessionFactory %%%%"); 
      e.printStackTrace(); 
     } 
     } 

     public static void closeSession() throws HibernateException { 
     Session session = (Session) threadLocal.get(); 
     threadLocal.set(null); 

     if (session != null) { 
      session.close(); 
     } 
     } 
    } 
+1

Quale database stai utilizzando e quanti sistemi si collegheranno al database alla volta? – Karthikeyan

+2

@Karthikeyan la domanda è aggiornata, 12 sistemi la stanno usando contemporaneamente e il database è mysql –

risposta

8

è necessario verificare con il vostro quadro reale quanta piscina massima di connessione minimo e si intende utilizzare. secondo il this article:

Piccola piscina di connessione:

avranno accesso più veloce sulla tabella dei collegamenti. Ma non può avere abbastanza connessioni per soddisfare le richieste e chiede possono passare più tempo in coda.

pool di connessione Grande:

avranno più connessioni per soddisfare le richieste e le richieste sarà spendere meno (o no) il tempo in coda a costo di più lento di accesso sulla tabella dei collegamenti.

quindi è necessario testare con alcuni pool di connessione, eseguire alcuni test di carico. Considera inoltre di ottenere le informazioni sull'utilizzo delle risorse/delle prestazioni sul carico corrente e di eseguire alcune analisi basate sui costi di transazione.

E dal risultato dell'analisi, se l'accesso alla tabella delle connessioni è troppo lento, è possibile ridurre il pool di connessioni o se la connessione non è sufficiente è possibile aggiungere più pool di connessioni. Bilancia quei fattori per ottenere un intervallo di tempo ottimale.

+0

Cosa sarebbe realistico per l'esempio sopra? – maxammann

2

Se si utilizza un server applicazioni (Jboss, Weblogic, Glassfish, ecc.), Questo tipo può mostrare alcune statistiche sull'utilizzo della piscina. Analizzare alcuni di questi dati (tempo massimo di attesa, connessioni massime in uso, ecc.) Ed eseguire alcuni test per trovare quali numeri si adattano meglio al caso.

0

devi usare terza piscina collegamento parti come c3p0. Da 20 a 30 connessioni richieste per 100 utenti concurrecnt. Devi fare il test della perfomance usando qualche strumento (come jmeter). Utilizzando lo strumento perfomance è possibile inviare il n numero di richieste simultanee. in base a tale rapporto è possibile aumentare o diminuire le dimensioni delle connessioni.

0

L'unico modo ragionevole per sapere quante connessioni sono necessarie effettuando il monitoraggio e le regolazioni. Questo perché la relazione tra il tempo di acquisizione della connessione, la dimensione del pool e il throughput della richiesta in entrata è data da Little's Law, quindi la dimensione del pool dipende dal numero di richieste in arrivo e da quanto tempo si desidera attendere prima di ottenere una connessione.

FlexyPool è un framework open source che consente di monitorare l'utilizzo di connessione, e può anche aumentare la dimensione del pool di là della capacità iniziale.

FlexyPool collects the following metrics:

  • connessioni simultanee istogramma
  • connessione simultanea richiede istogramma
  • connessione origine dati
  • tempo acquisire istogramma
  • collegamento volta locazione istogramma
  • massima dimensione del pool istogramma
  • connessione totale acquisizione dell'istogramma temporale
  • trabocco dimensione del pool di istogramma
  • nuovo tentativo istogramma

Supporta quasi tutte le principali soluzioni di pool di connessioni:

  • Apache DBCP
  • Apache DBCP2
  • C3P0
  • BoneCP
  • Ciao kariCP
  • Tomcat CP
  • Vibur DBCP
  • Bitronix Transaction Manager
  • Atomikos TransactionsEssentials
  • Java EE DataSources

utilizza Codahale/Dropwizard metriche in modo da poter integrare con Graphana o grafite.

Quindi, torna alla tua domanda. È possibile iniziare con una piccola dimensione del pool (5 connessioni) e configurare un buffer di overflow di 5 connessioni extra. È possibile impostare l'intervallo di timeout in base allo SLA dell'applicazione (100 ms). Quindi, è possibile monitorare l'utilizzo del pool di connessioni as explained in this article.

Problemi correlati