Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Hibernate in a multi threaded application?

Tags:

java

hibernate

I am trying to use Hibernate for a multi threaded application wherein each thread retrieves an object and tries to insert it into a table. My code looks like below. I have local hibernate Session objects per thread and in each InsertData I do beginTransaction and commit.

The problem I am facing is that many times I get "org.hibernate.TransactionException: nested transactions not supported"

Since I am new to hibernate I don't know if what I am doing is correct or not? Please let me know what is the correct way to use hibernate in multi threaded app and how to avoid the above mentioned exception.

Thanks

public class Worker extends Thread {
private Session session = null;

Worker() {
    SessionFactory sf = HibernateUtil.getSessionFactory(); // Singleton
    session = sf.openSession();
    session.setFlushMode(FlushMode.ALWAYS);
}

public void run() {
    // Some loop which will run thousand of times 
    for (....)
    {
        InsertData(b);
    }
    session.close();
}

// BlogPost Table has (pk = id AutoGenerated), dateTime, blogdescription etc. 
private void InsertData(BlogPost b) {
    session.beginTransaction();
    Long id = (Long) session.save(b);
    b.setId(id);
    session.getTransaction().commit();
}
}

My hibernate config file has c3p0.min_size=10 and c3p0.max_size=20

like image 555
Rahul Avatar asked Aug 13 '13 17:08

Rahul


People also ask

Is hibernate multithreaded?

If you wish to be able to both work multithreaded AND use hibernate's session — you have to spawn threads using @Async calls — directly from the running thread. It must be applied to public methods only. Self-invocation — calling the async method from within the same class — won't work.”

Why session is not thread-safe in hibernate?

No, Session is not a thread-safe object, many threads can access it simultaneously. In other words, you can share it between threads.

What are examples of multi threaded applications?

Another example of a multithreaded program that we are all familiar with is a word processor. While you are typing, multiple threads are used to display your document, asynchronously check the spelling and grammar of your document, generate a PDF version of the document.


1 Answers

With session-objects-per-thread, as long as you are not sharing session objects between multiple threads, you will be fine.

The error you are receiving is unrelated to your multithreaded usage or your session management. Your usage of session.save() as well as explicitly setting the ID is not quite right.

Without seeing your mapping for BlogPost its hard to tell, but if you have told Hibernate to use the id field as the primary key, and you are using the native generator for primary keys, the all you need to do is this:

session.beginTransaction();
session.persist(b);
session.flush(); // only needed if flush mode is "manual"
session.getTransaction().commit();

Hibernate will fill in the ID for you, persist() will cause the insert to happen within the bounds of the transaction (save() does not care about transactions). If your flush mode is not set to manual then you don't need to call flush() as Transaction.commit() will handle that for you.

Note that with persist(), the BlogPost's ID is not guaranteed to be set until the session is flushed, which is fine for your usage here.

To handle errors gracefully:

try {
    session.beginTransaction();
    try {
        session.persist(b);
        session.flush(); // only needed if flush mode is "manual"
        session.getTransaction().commit();
    } catch (Exception x) {
        session.getTransaction().rollback();
        // log the error
    }
} catch (Exception x) {
    // log the error
}

By the way, I suggesting making BlogPost.setId() private, or package visible. It is most likely an implementation error if another class sets the ID explicitly (again assuming native generator, and id as primary key).

like image 107
Jason C Avatar answered Sep 21 '22 16:09

Jason C