Управление пулами соединений в мультитенантном веб-приложении с помощью Spring, Hibernate и C3P0

Я пытаюсь настроить мультитенантное веб-приложение с (в идеале) возможностью одновременно для подхода с разделением баз данных и схем. Хотя я собираюсь начать с разделения схемы. В настоящее время мы используем:

Spring 4.0.0Hibernate 4.2.8Hibernate-c3p0 4.2.8 (который использует c3p0-0.9.2.1)и PostgreSQL 9.3 (я сомневаюсь, что это действительно имеет значение для общей архитектуры)

В основном я следовалэта тема (из-за решения для@Transactional). Но я как бы теряюсь в реализацииMultiTenantContextConnectionProvider, Существует такжеэтот похожий вопрос спросил здесь о SO, но есть некоторые аспекты, которые я не могу понять:

1) Что происходит с пулами соединений? Я имею в виду, это управляется Spring или Hibernate? Я думаю, сConnectionProviderBuilder - или, как предложено, - в любой из его реализаций Hibernate - парень, который управляет этим.
2) Это хороший подход, что Spring не управляет пулами подключений? или даже возможно, что Spring справится с этим?
3) Является ли это правильным путем для будущей реализации разделения базы данных и схемы?

Любые комментарии или описания полностью приветствуются.

Приложение-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.
    }
}


редактировать

относительноответ из @ ben75:

Это новая реализацияMultiTenantContextConnectionProvider, Больше не распространяетсяAbstractMultiTenantConnectionProvider, Скорее реализуетMultiTenantConnectionProvider, чтобы иметь возможность вернуться[Connection][4] вместо[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;
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос