On Mar 2, 2006, at 6:53 PM, Allen Gilliland wrote:
On Thu, 2006-03-02 at 14:31, David M Johnson wrote:
On Mar 2, 2006, at 1:55 PM, Allen Gilliland wrote:
On Wed, 2006-03-01 at 22:00, Anil Gangolli wrote:
OK.  -1.  I'm against dropping them until we understand the
pattern that
is being proposed to replace them.
The pattern would be to encapsulate things in logical operations in
the manager classes.  When you do things like weblog.delete() or
user.delete() or register a weblog, those things are multi step
operations to the persistence layer, but they are a single
operation logically.

That's a good goal to have, but we're not there yet and it will take
significant refactoring to get there. I totally agree that there is
too much app logic in the presentation layer. That stuff should be
moved into the manager classes behind the Roller interface.

I'm sorry if this sounds like badgering, but "we're not there yet" because nobody has stepped up and 1) identified the problem and 2) said they will do the work. I am saying right now that I will do that work because I think it's an extremely important and fundamental aspect of the application which I believe is currently not working properly.

I'm definitely for refactoring to move app and persistence logic to the back end, would like to see some proposals and would love to help, but we should take somethings into consideration before we starting making changes.

It's mostly about timing:

- We have tagging work from Elias being that we need to get into the trunk. Probably want to hold off on refactoring until that is integrated as any changes will make the work harder to integrate.

- Craig Russell was working on a JDO port of the back-end. Refactoring will clash with his work to (assuming it is still underway).

- While refactoring is going on it will be more difficult for others to work on EJB3 or JDO stuff. For example, now that I'm getting my free time back (book is done next week) I'm personally interested in pursuing the EJB3 alternative.

But there are also technical issues:

- We don't want to do things that will reduce our ability to move to JDO or EJB3 in the future (e.g. Matt mentioned Spring's declarative transactions, would that cause problems or redundancy if we moved to EJB3 at some point?)


Also, what specific thing are you referring to when you say "not working properly"


We may open and close our db connection many times in a given
request/response cycle in order to fetch data and/or save it.

That's not a good idea. The design has always been to use *at most*
one database connection in the processing a request. If that's not
happening, then we have a bug.

I think we are mixing concepts again. First off, unless someone is not using a connection pool then technically their database connection is always open. A normal connection pool keeps all of its connections to the database open at all times.

That's what I thought too, but I found though experience that the most performant approach was to get a connection at the start of a request and return it to the pool at the end.


Secondly, a transaction is more like opening a Statement for execution, not opening an entirely new database connection. I am not positive, but I believe Hibernate ensures that only a single database connection is associated with a Session until the Session is closed.

Yes, that is correct. A session has a one connection.


So we are agreeing on the same pattern, you open a Session once per request and during that Session you perform any number of Transactions.

Yes.


again, I think we are crossing our vocabulary. I think of a transaction as being a single atomic unit of work done against the database. You may do multiple sql operations in a single transaction, but the transaction as a whole represents one unit of work. An entire request does not have to be a single transaction in my mind.

Yes, I was using transaction in a more general sense, but it is true that most Roller requests do one database transaction (i.e. issue one commit() call to make changes to the database).


Consider. In a single request you may start by querying for a dozen objects which you will use along the way, perhaps the UserData for the user who is logged in, etc. Then the request hits the proper struts action class where it collects data from the request object, formats it, and uses it to store a new weblog entry. Then you continue on to the view where you find you need to query for a few more objects used to populate the display.

I see what you mean. I wasn't considering a query to be a transaction.


Maybe so, but until we've refactored all app and persistence logic
into the back-end managers, we need begin(), commit() and rollback().

Ok, then how about I go ahead and do that?
And even after we've done that, we may still need Open Session in View:
http://www.hibernate.org/43.html

There is nothing that prevents us from doing this.

I think we two are in agreement on this.

- Dave

Reply via email to