Wanted to point out that a Map keyed by SQL is not sufficient, because that approach would not properly account for self-referential associations (the same SQL).
The patch provided for HHH-1 is well thought out in terms of accounting for all association scenarios. It does not, of course, handle multi-table structures which require a much different type of solution given how Hibernate groups the DML for these behind the persisters (I know the general approach I will use to solve this one now, btw). On Thursday 23 August 2007 01:32:02 am Max Rydahl Andersen wrote: > http://opensource.atlassian.com/projects/hibernate/browse/HHH-1 > > /max > > > I thought his question was a little too technical for the general list, > > so I thought I¹d ask it here. Is there a technical reason why Hibernate > > does not or cannot support the batching of multiple (different) object > > insertions within the same session? > > > > I have code that is semantically equivalent to: > > > > Session session = sessionFactory.getCurrentSession(); > > for (int i = 0; i < 1000; i++) { > > Foo foo = new Foo(); > > session.save(foo); > > > > Bar bar = new Bar(); > > session.save(bar); > > } > > session.flush(); > > > > If Foo or Bar is not in the equation, batching occurs as desired. > > However, if both Foo and Bar are inserted during the session in > > alternating fashion the result is that in the ActionQueue the 'insertion > > list' is interleaved with Foo's and Bar's. This is natural enough it > > seems. However, when ActionQueue.executeActions() is called the > > following occurs... > > > > 1) executeAction() iterates through the insertion list calling execute() > > on each Executable in the list > > 2) the Executable.execute() method calls insert() on the associated > > persister, in the case a SingleTableEntityPersister. It seems to realize > > that it CAN batch these inserts and so ... > > 3) insert() calls the BatchingBatcher.prepareBatchStatement(sql) which is > > actually a method on AbstractBatcher. This is where things go "awry"... > > > > The prepareBatchStatement(sql) does this thing where it compares the SQL > > statement that was provided with the _last SQL that it executed_ and if > > they match it re-uses the _last PreparedStatement_ which it also hung > > onto, otherwise it closes the existing PreparedStatement and creates a > > new one -- effectively ending the current "batch". > > > > In this case, because the objects are interleaved in the insertion list > > the result is that the prepareBatchStatement() is called with: > > > > insert into foo (a, b, c) values (?, ?, ?) > > insert into bar (x, y, z) values (?, ?, ?) > > insert into foo (a, b, c) values (?, ?, ?) > > insert into bar (x, y, z) values (?, ?, ?) > > insert into foo (a, b, c) values (?, ?, ?) > > insert into bar (x, y, z) values (?, ?, ?) > > ... > > > > The result being that each subsequent statement terminates the statement > > prepared before it, preventing batching from occuring. Well, it logs a > > debug message saying "Executing batch size: 1" for each statement. > > > > So my question is this ... is there any reason not to use a Map<sql, > > PreparedStatement> construct in the BatchingBatcher such that the > > appropriate PreparedStatement can be located and re-used based on the > > incoming SQL rather than only retaining the _last_ SQL statement which is > > guaranteed to "flap" in the case of alternating (or multiple) objects? > > > > If there is no technical reason why this shouldn't be done or wouldn't > > work, I will be happy to make the change and submit a patch. [Can you > > tell how bad I need batching in this scenario?] > > > > Thanks, > > Brett Wooldridge > > The ZipTie Project > > www.ziptie.org > > > > > > _______________________________________________ > > hibernate-dev mailing list > > hibernate-dev@lists.jboss.org > > https://lists.jboss.org/mailman/listinfo/hibernate-dev > > _______________________________________________ > hibernate-dev mailing list > hibernate-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/hibernate-dev _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev