Hallo,
ich suche für eine Anwendung eine möglichst schnelle Lösung um viele eingehende Daten in einer MySQL Datenbank zu speichern.
Ich setze Hibernate 3.1.3 und MySQL 5.0.18 ein.
Die Zieltabelle besteht aus 5 Spalten vom Typ DOUBLE sowie einer ID Spalte BIGINT mit Autoinkrement. Da ich im Rest der Anwendung bereits Hibernate einsetze, würde ich auch dieses Problem damit realisieren.
Jetzt suche ich nach einer optimalen Lösung.
Folgendes habe ich bereits auspobiert:
Ich habe mir eine Liste mit 20.000 Objekten zum Speichern generiert.
Lösung1: Hibernate Batch-Insert
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<list.size(); i++ )
{
Message message = (Message) list.get(i);
session.save(message);
if ( i % 30 == 0 ) //30 auch als JDBC batch size eingestellt
{
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Lösung2: Hibernate Stateless Session
Session session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<list.size(); i++ )
{
Message message = (Message) list.get(i);
session.save(message);
}
tx.commit();
session.close();
Parallel dazu habe ich das Gleiche auch mit JDBC probiert, und zwar einmal mit normalen Inserts und einmal mit PreparedSQL. Außerdem habe ich auch noch iBATIS im Batch getestet.
Für die 20.000 Objekte konnte ich folgende Zeiten messen:
System 1: P4-D mit 1GB RAM
Hibernate Batch-Insert: 11.4s
Hibernate Stateless: 8.8s
JDBC Standard: 4.9s
JDBC Prepared SQL: 3.7s
iBATIS: 4.6s
System 2: Dual-Xeon mit 4GB RAM
Hibernate Batch-Insert: 8.3s
Hibernate Stateless: 4,4s
JDBC Standard: 4.6s
JDBC Prepared SQL: 2.2s
iBATIS: 2.3s
Kennt jemand vielleicht noch eine schnellere Lösung mit Hibernate?
Danke,
Carsten
|