high performance hibernate einfügen

Arbeite ich an einem Latenz-sensitive Teil einer Anwendung, die im Grunde erhalte ich ein Netzwerk-event die Daten transformieren, und dann legen Sie alle Daten in die DB. Nach profiling-ich sehe, dass im Grunde alle meine Zeit damit verbracht, die Daten zu speichern. hier ist der code

private void insertAllData(Collection<Data> dataItems)
{
    long start_time = System.currentTimeMillis();
    long save_time = 0;
    long commit_time = 0;
    Transaction tx = null;
    try
    {
        Session s = HibernateSessionFactory.getSession();
        s.setCacheMode(CacheMode.IGNORE);
        s.setFlushMode(FlushMode.NEVER);
        tx = s.beginTransaction();
        for(Data data : dataItems)
        {
            s.saveOrUpdate(data);
        }
        save_time = System.currentTimeMillis();
        tx.commit();
        s.flush();
        s.clear();
    }
    catch(HibernateException ex)
    {
        if(tx != null)
            tx.rollback();
    }
    commit_time = System.currentTimeMillis();
    System.out.println("Save: " + (save_time - start_time));
    System.out.println("Commit: " + (commit_time - save_time));
    System.out.println();
}

Die Größe der Sammlung ist immer kleiner als 20. hier ist die timing-Daten, die ich sehe:

Save: 27
Commit: 9

Save: 27
Commit: 9

Save: 26
Commit: 9

Save: 36
Commit: 9

Save: 44
Commit: 0

Dies ist verwirrend für mich. Ich vermute, dass die save sollte schnell sein und alle die Zeit, die aufgewendet werden sollten commit. aber klar, ich bin falsch. Ich habe auch versucht haben, entfernen die Transaktion (die nicht wirklich notwendig), aber ich sah mal schlimmer... ich habe den Ruhezustand.jdbc.batch_size=20...

Kann ich erwarten zu bekommen, so viele wie 500 Nachrichten/Sekunde, so brauche ich single-message-handling unter 20 Millisekunden.

ich muss diese operation so schnell wie möglich, im Idealfall gäbe es nur einen roundtrip zur Datenbank. Wie kann ich dies tun?

InformationsquelleAutor der Frage luke | 2010-06-12

Schreibe einen Kommentar