jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jukka Zitting (JIRA)" <j...@apache.org>
Subject [jira] Updated: (JCR-245) Automatic repository shutdown
Date Tue, 06 Dec 2005 23:39:09 GMT
     [ http://issues.apache.org/jira/browse/JCR-245?page=all ]

Jukka Zitting updated JCR-245:
------------------------------

    Attachment: TransientRepository.patch

The attached patch contains org.apache.jackrabbit.core.TransientRepository, a proxy repository
class that automatically initializes and shuts down the underlying RepositoryImpl instance
when sessions are opened or closed. I implemented this as a separate class to avoid overloading
the already heavy RepositoryImpl class. The implementation is quite clean except for two things:
1) it loads the default repository descriptors directly from repository.properties, and 2)
it messes with RepositoryImpl.loggedOut(SessionImpl) to avoid a nasty infinite loop in RepositoryImpl.shutdown().

The class is quite easy to use and works very well with component containers like Spring where
setting up an explicit shutdown call is difficult and cumbersome. If it weren't for the repository
initialization and shutdown overhead, it would also make a fine candidate for solving the
deployment model 2 shutdown issues discussed lately on the mailing list. The implementation
also relies on all clients properly closing all the sessions they've opened. If needed, the
implementation could be modified to use a WeakHashMap to cope with lost sessions.

Example code:

    RepositoryConfig config = RepositoryConfig.create("...", "...");
    Repository repository = new TransientRepository(config);
    Session session = repository.login();  // Repository gets initialized
    try {
        // Use the session
    } finally {
        session.logout(); // Repository gets shut down
    }

Any problems with this approach that I haven't noticed? I've been quite happy using a class
like this in my Spring-based projects, so unless anyone objects I'll go ahead and commit it
so others can use it too.


> Automatic repository shutdown
> -----------------------------
>
>          Key: JCR-245
>          URL: http://issues.apache.org/jira/browse/JCR-245
>      Project: Jackrabbit
>         Type: New Feature
>   Components: core
>     Reporter: Jukka Zitting
>  Attachments: TransientRepository.patch
>
> Currently Jackrabbit relies on two mechanisms for safely shutting down a repository:
>     1) client application invoking RepositoryImpl.shutdown(), or
>     2) the shutdown hook installed by RepositoryImpl being run
> Both of these mechanisms have problems:
>     1) The shutdown() method is not a part of the JCR API, thus making the client application
depend on a Jackrabbit-specific feature
>     2) In some cases the shutdown hook is not properly run (see issues JCR-120 and JCR-233)
> I think the JCR spec thinks of the Repository and Session interfaces as being somewhat
similar to the JDBC DataSource and Connection interfaces. The Repository instances have no
real lifecycle methods while the Session instances have clearly specified login and logout
steps. (DataSource.getConnection() = Repository.login(), Session.logout() = Connection.close())
However the Jackrabbit implementation defines an explicit lifecycle for the RepositoryImpl
instances.
> This causes problems especially for container environments (JNDI, Spring) where it is
hard or even impossible to specify a shutdown mechanism for resource factories like the Repository
instances. The current solution for such environments is to use a shutdown hook, but as reported
this solution does not work perfectly in all cases.
> How about if we bound the RepositoryImpl lifecycle to the lifecycles of the instantiated
Sessions. A RepositoryImpl instance could initialize (and lock) the repository when the first
session is opened and automatically shut down when the last session has logged out. As long
as the sessions are properly logged out (or finalized by the garbage collector) there would
be no need for an explicitly RepositoryImpl.shutdown() call. The current behaviour of pre-initializing
the repository and shutting down during a shutdown hook could be enabled with a configuration
option for environments (like global JNDI resources) in which the shutdown hooks work well.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


Mime
View raw message