Administre la agrupación de conexiones en la aplicación web multiusuario con Spring, Hibernate y C3P0

Estoy tratando de configurar una aplicación web de múltiples inquilinos, con (idealmente) la posibilidad de un enfoque separado por la Base de datos y por el Esquema al mismo tiempo. Aunque voy a empezar con la separación de esquemas. Actualmente estamos usando:

Primavera 4.0.0Hibernar 4.2.8Hibernate-c3p0 4.2.8 (que utiliza c3p0-0.9.2.1)y PostgreSQL 9.3 (lo cual dudo que realmente importe para la arquitectura general)

Mayormente seguíeste hilo (debido a la solución para@Transactional). Pero estoy un poco perdido en la implementaciónMultiTenantContextConnectionProvider. También hayesta pregunta similar Pregunté aquí en SO, pero hay algunos aspectos que no puedo entender:

1) ¿Qué sucede con la agrupación de conexiones? Quiero decir, ¿es administrado por Spring o Hibernate? Supongo que conConnectionProviderBuilder - o como se sugirió - cualquiera de su implementación, Hibernate es la persona que lo maneja.
2) ¿Es un buen enfoque que Spring no gestiona la agrupación de conexiones? o ¿Es posible que Spring lo logre?
3) ¿Es este el camino correcto para la futura implementación de la separación entre la Base de datos y el Esquema?

Cualquier comentario o descripción son totalmente apreciados.

application-context.xml

<beans>
    ...
    <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="c3p0DataSource" />
    </bean>

    <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="org.postgresql.Driver" />
        ... other C3P0 related config
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="packagesToScan" value="com.webapp.domain.model" />

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.default_schema">public</prop>

                <prop key="hibernate.multiTenancy">SCHEMA</prop>
                <prop key="hibernate.tenant_identifier_resolver">com.webapp.persistence.utility.CurrentTenantContextIdentifierResolver</prop>
                <prop key="hibernate.multi_tenant_connection_provider">com.webapp.persistence.utility.MultiTenantContextConnectionProvider</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="autodetectDataSource" value="false" />
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

   ...
</beans>

CurrentTenantContextIdentifierResolver.java

public class CurrentTenantContextIdentifierResolver implements CurrentTenantIdentifierResolver {
    @Override
    public String resolveCurrentTenantIdentifier() {
        return CurrentTenantIdentifier;  // e.g.: public, tid130, tid456, ...
    }

    @Override
    public boolean validateExistingCurrentSessions() {
        return true;
    }
}

MultiTenantContextConnectionProvider.java

public class MultiTenantContextConnectionProvider extends AbstractMultiTenantConnectionProvider {
    // Do I need this and its configuratrion?
    //private C3P0ConnectionProvider connectionProvider = null;

    @Override
    public ConnectionProvider getAnyConnectionProvider() {
        // the main question is here.
    }

    @Override
    public ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
        // and of course here.
    }
}


Editar

Respecto ala respuesta de @ ben75:

Esta es una nueva implementación deMultiTenantContextConnectionProvider. Ya no se extiendeAbstractMultiTenantConnectionProvider. Más bien implementaMultiTenantConnectionProviderpoder volver[Connection][4] en lugar de[ConnectionProvider][5]

public class MultiTenantContextConnectionProvider implements MultiTenantConnectionProvider, ServiceRegistryAwareService {
    private DataSource lazyDatasource;;

    @Override
    public void injectServices(ServiceRegistryImplementor serviceRegistry) {
        Map lSettings = serviceRegistry.getService(ConfigurationService.class).getSettings();

        lazyDatasource = (DataSource) lSettings.get( Environment.DATASOURCE );
    }

    @Override
    public Connection getAnyConnection() throws SQLException {
        return lazyDatasource.getConnection();
    }

    @Override
    public Connection getConnection(String tenantIdentifier) throws SQLException {
        final Connection connection = getAnyConnection();

        try {
            connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'");
        }
        catch (SQLException e) {
            throw new HibernateException("Could not alter JDBC connection to specified schema [" + tenantIdentifier + "]", e);
        }

        return connection;
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta