I have 5 MySQL InnoDB tables: Test,InputInvoice,InputLine,OutputInvoice,OutputLine and each is mapped and functioning in Hibernate. I have played with using StatelessSession/Session, and JDBC batch size. I have removed any generator classes to let MySQL handle the id generation- but it is still performing quite slow.
Each of those tables is represented in a java class, and mapped in hibernate accordingly. Currently when it comes time to write the data out, I loop through the objects and do a session.save(Object) or session.insert(Object) if I’m using StatelessSession. I also do a flush and clear (when using Session) when my line count reaches the max jdbc batch size (50).
- Would it be faster if I had these in a ‘parent’ class that held the objects and did a
session.save(master)instead of each one? - If I had them in a master/container class, how would I map that in hibernate to reflect the relationship? The container class wouldn’t actually be a table of it’s own, but a relationship all based on two indexes run_id (int) and line (int).
- Another direction would be: How do I get Hibernate to do a multi-row insert?
The final solution for me was to use voetsjoeba’s response as a jumping off point.
My hibernate config uses the following options:
I changed from using
SessiontoStatelessSessionRe-ordered the
Java code to process all the elements
in a batch a table at a time. So all
of table x, then table y, etc.
Removed the
<generator>from eachclass. Java now creates it and
assigns it to the object
Created logic that allowed me to determine if just
an id was being set and not write
’empty’ lines to the database
Finally, I turned on
dynamic-insertfor my classes in their hibernate
definitions like so:
<class name="com.my.class" table="MY_TABLE" dynamic-insert="true">