2009-04-09 6 views
4

Die Anwendung verwendet, wenn sie entwickelt wird, eine einzige Datenbank und die Federkonfiguration ist wie folgt.MySQL-Cluster (Master/Slave) und Hibernate

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/test" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 


<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="properties"> 
    <props> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     ... 
     </props> 
    </property> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref local="dataSource" /> 
    </property> 
    <property name="hibernateProperties"> 
    <ref bean="hibernateProperties" /> 
    </property> 
    <property name="mappingResources"> 
    <list> 
     <value>...</value> 
    </list> 
    </property> 
</bean> 

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

Für die Produktion besteht jedoch die Möglichkeit, dass entweder MySQL-Clustering oder Master/Slave-Replikation verwendet wird. Irgendeine Idee über den Code/die Konfiguration ändert sich dafür?

Auch eine kurze Frage an alle - Wie viel Transaktionen/sec kann eine einzelne MySQL Server-Instanz, die auf einem dedizierten Server läuft, verarbeiten?

+0

Ich erkannte, dass es bessere Ansätze gibt, wie das Einführen einer neuen Ebene, sagen wir Terracotta, und benutze die Hibernate-Entitäten als losgelöste Objekte, so dass eine einzige Datenbank die Anforderung erfüllen kann. –

+0

Hallo, konntest du mysql Replikation mit Spring/Hibernate konfigurieren? Ich habe auch Probleme mit dem gleichen Problem. –

Antwort

1

Ich habe an einem ähnlichen Problem gearbeitet, obwohl Spring nicht beteiligt war. Wir entwickelten das Zeigen gegen eine lokale Instanz von MySQL (jeder Entwickler hatte einen auf seiner Box), und das Produktionssystem war ein Master/Slave-Replikationsring. Wir sind sogar noch einen Schritt weiter gegangen und haben den Anwendungsserver gemeinsam mit dem Datenbankserver lokalisiert, sodass sowohl auf der Anwendungs- als auch auf der Datenbankebene ein Cluster mit vier Knoten vorhanden war.

Unsere Anwendung lief in JBoss. Es war ziemlich leicht, hatte aber auf dem Anwendungsserver einige ernsthafte Cluster. Mit all dem konnten wir 300 Anfragen/Sekunde und manchmal fast 1000 Anfragen/Sekunde erreichen (abhängig von der Verarbeitung der Anwendung). Die Datenbank war nie ein Engpass - selbst bei diesen Raten sahen wir den Verbindungspool selten über 5 Verbindungen.

In beiden Fällen (meins und deins), da die JDBC-URL auf den lokalen Server verweist, gibt es aus Sicht der Anwendung keinen funktionalen Unterschied. Ich musste einige interessante Konfigurationsspiele mit dem Auto-Inkrement-Setup spielen, um zu verhindern, dass die Daten verändert werden. Wenn Sie nur einen einzigen Bereitstellungspunkt (und damit einen Zugangspunkt zu den MySQL-Instanzen) haben, sollten Sie sich darüber keine Gedanken machen.

Also, keine Codeänderungen und keine Konfigurationsänderungen. Es wird einfach funktionieren. Unter Standardbedingungen macht die Tatsache, dass Sie von einem Master/Slave-Instanzpaar oder einem Cluster unterstützt werden, keinen Unterschied, da Sie höchstwahrscheinlich entweder auf den Master oder die MySQL-Instanz vor dem Cluster zeigen (in MySQL) Der Cluster befindet sich hinter einem oder mehreren Datenbankservern und repliziert Daten.

Mit welchen Lastarten möchten Sie umgehen? MySQL war benchmarked in der Vergangenheit bei> 1000 TPS, aber die Ergebnisse neigen dazu, basierend auf den zugrunde liegenden Systemeigenschaften (Speicher, CPU-Kerne, Prozessorgeschwindigkeit), Reaktionsfähigkeit Ihrer Anwendung und gleichzeitige Threads zu variieren.

-1

Wenn die Replikation in MySQL aktiviert ist, wirkt sich dies nicht auf Ihre Hibernate-Konfiguration aus, wenn die von Hibernate verwendete DataSource eine Verbindung zum Master herstellt, was typisch ist. Wenn Sie sich auch mit dem Slave verbinden müssen (zum Abfragen), dann ist das eine andere Konfiguration.

mlschechter ist richtig, MySQL kann Tausende von Transaktionen pro Sekunde auf richtig abgestimmter Hardware verarbeiten. Darüber hinaus kann Hibernate verwendet werden, um die Belastung der Datenbank zu reduzieren (Session-in-View-Frameworks, Second-Level-Cache), sodass Sie auf der Seite des Anwendungsservers weiter skalieren können, bevor Sie eine neue Datenbank erstellen müssen.

+0

Downvote und keine Erklärung? Stimmt etwas nicht mit meiner Antwort? –