On 3/18/06, Jukka Zitting <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I just added JNDI/DataSource -based versions of the database
> persistence manager and file system classes as requested in JCR-313.
> The comments on the issue thread got me thinking about the current
> "simple" approach and database configurability in general. The
> database file system classes are pretty much mirrors of the
> persistence manager counterparts, so I'll just focus on the PM classes
> here, the same ideas apply to both situations.
>
> The JCR-313 issue thread focused much on the question of
> implementation "simplicity". After going throught the code I think the
> question has more to do with the approach of keeping the database
> connection throughout the PM lifecycle and caching prepared statements
> for performance rather than any inherent simplicity of the
> implementaion approach.

'Simple' also refers to use of a very simple data model instead of
a fully normalized schema or some object-relational mapping.

> The main point seems to be that the current
> implementation wants to prepare the used statements once during
> initialization rather than once per method call. This is somewhat in
> conflict with the J2EE best practice of keeping a database connection
> and related resources like prepared statements only for the duration
> of a single operation.

those best practices apply to j2ee applications. the point is that i don't
consider jackrabbit to be a j2ee application, jackrabbit is infrastructure
and has other requirements regarding its persistence layer than a
database application.

>
> Incidentally there happens to be one approach that would keep the
> performance advantages of the current approach, remove the conflict
> with J2EE practices, and even simplify the implementation! Like this:
>
> 1) Change the DatabasePersistenceManager to get a database connection
> and prepare the used statements per each operation to comply with J2EE
> practices.

note that write operations must occur within a single transaction, i.e.
you can't get a new connection for every write operation.

>
> 2) Use the Commons DBCP DriverAdapterCPDS DataSource implementation
> with PreparedStatement pooling in SimpleDbPersistenceManager to keep
> the performance gains.
>
> 3) Remove the now unneeded Connection and PreparedStatement members
> and resetStatement() method from the DatabasePersistenceManager class
> to simplify the implementation.
>
> The cost of this change would be a bit of pooling overhead per each
> persistence manager operation (should be insignificang compared to the
> cost of the database operations) and the introduction of commons-dbcp
> and commons-pool as dependencies.
>
> This change would also clarify that the responsibility of any extra
> database shutdown operations like in the current
> DerbyPersistenceManager rests on the subclass as the
> DatabasePersistenceManager class would no longer keep any stable
> reference to the underlying database.
>
> What do you think? I can take a shot at implementing this if you think
> it's worth doing.

-1 for changing SimpleDbPersistenceManager as suggested right now

on the other hand i have problem with adding a new more sophisticated
db pm as suggested.

time and experience will tell if we want to keep them both or not.

cheers
stefan

>
> BR,
>
> Jukka Zitting
>
> --
> Yukatan - http://yukatan.fi/ - [EMAIL PROTECTED]
> Software craftsmanship, JCR consulting, and Java development
>

Reply via email to