2012-03-16 8 views
6

Sto usando Spring 3.1.0.RELEASE, Hibernate 4.0.1.Final e MySQL 5.1. Qual è la fonte di dati aggregata che dovrei usare? Attualmente sto usando (frammento dal file di contesto dell'applicazione) ...Quale origine dati aggregata dovrei utilizzare per Spring 3.1.0, Hibernate 4.0.1.Final e MySQL 5.1?

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"> 
     <value>com.mysql.jdbc.Driver</value> 
    </property> 
    <property name="url"> 
     <value>jdbc:mysql://localhost:3306/myproj</value> 
    </property> 
    <property name="username"> 
     <value>myproj</value> 
    </property> 
    <property name="password"> 
     <value>password</value> 
    </property> 
</bean> 

ma questo non è una fonte di dati aggregati, la creazione di connessioni JDBC su ogni chiamata. Ho usato per avere questo Hibernate config (hibernate.cfg.xml) ...

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myproj</property> 
    <property name="hibernate.connection.username">myproj</property> 
    <property name="hibernate.connection.password">password</property> 
    <property name="hibernate.connection.pool_size">10</property> 
    <property name="show_sql">true</property> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
    ... 

ma a causa di un bug in primavera 3.1.0, non posso utilizzare un file hibernate.cfg.xml quando si configura la mia session bean fabbrica (che ho cercato di fare in questo modo - frammento del file di contesto dell'applicazione primavera ...)

<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory"> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 

risposta

5

È possibile utilizzare Apache DBCP, che dovrebbe essere un rimpiazzo qualcosa di simile:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
    <property name="maxActive" value="10"/> 
    <property name="minIdle" value="5"/> 
    <!-- SELECT 1 is a simple query that returns 1 row in MySQL --> 
    <property name="validationQuery" value="SELECT 1"/> 
</bean> 

alcune cose da notare

  • è possibile configurare il numero massimo di connessioni.
  • è possibile configurare il numero minimo di connessioni inattive.
  • una query che verrà eseguita per convalidare la connessione è ancora valida.

Ulteriori opzioni esistono per configurare quando avviene la convalida.

+0

Ora org.apache.commons.dbcp2.BasicDataSource –

1

Apache DBCP è un pool ampiamente utilizzato. Ma non utilizzare l'opzione testWhileIdle. Se abilitato, il thread di evictor di background blocca tutte le nuove connessioni durante la verifica delle connessioni non funzionanti. È inaccettabile in qualsiasi ambiente non giocattolo. Oltre a questo, non abbiamo problemi con esso.

È possibile leggere ulteriori informazioni sui pool in this SO thread, ma si tenga presente che tutte le fiamme relative al "pool più veloce" hanno senso solo con una regolazione specifica sotto carico specifico.

5

Se si desidera utilizzare qualcosa di maturo e performant (ad esempio non Apache DBCP), utilizzare BoneCP.

Qui ci sono le opzioni è possibile modificare:

<!-- BoneCP configuration --> 
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb" /> 
    <property name="username" value="root"/> 
    <property name="password" value="abcdefgh"/> 
    <property name="idleConnectionTestPeriod" value="60"/> 
    <property name="idleMaxAge" value="240"/> 
    <property name="maxConnectionsPerPartition" value="30"/> 
    <property name="minConnectionsPerPartition" value="10"/> 
    <property name="partitionCount" value="3"/> 
    <property name="acquireIncrement" value="5"/> 
    <property name="statementsCacheSize" value="100"/> 
    <property name="releaseHelperThreads" value="3"/> 
</bean> 

BoneCP forum è molto attivo, e committer sono abbastanza reattivo.

Un altro che si può vedere (sarebbe sentito) è C3PO, anche se BoneCP esegue molto meglio.

1

Fondamentalmente dipende dalla vostra applicazione.

Ci sono condizioni qui di seguito (presi da here):

  1. Per prova o ambienti autonomi di fuori di un contenitore J2EE, utilizzare DriverManagerDataSource
  2. Per l'uso in un contenitore J2EE, si raccomanda di utilizzare un JNDI DataSource fornito dal contenitore.
  3. Per l'utilizzo di un'origine dati pool di connessioni all'esterno di un contenitore J2EE, prendere in considerazione Jakarta di Apache Commons DBCP o C3P0.
Problemi correlati