2014-12-07 46 views
1

我正在使用Postgresql作爲我的基礎數據庫,並讓Spring管理我的數據源/連接池。我的配置已經是這個C3P0託管連接池無法從其主數據庫或工廠資源獲取資源

<bean id="clientDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="org.postgresql.Driver"/> 
     <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/genesis_cms"/> 
     <property name="user" value="user"/> 
     <property name="password" value="password"/> 
    </bean> 


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="clientDataSource"/> 
     <property name="packagesToScan" value = "org.myproject.package.commons.model.*"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.sql.dialect}</prop> 
       <prop key="hibernate.connection.pool_size">${hibernate.connection.pool_size}</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 
       <prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop> 
       <prop key="show_sql">true</prop> 
       <prop key="hibernate.c3p0.min_size">5</prop> 
       <prop key="hibernate.c3p0.max_size">15</prop> 
       <prop key="hibernate.c3p0.timeout">300</prop> 
       <prop key="hibernate.c3p0.max_statements">50</prop> 
       <prop key="hibernate.c3p0.idle_test_period">3000</prop> 

SCHEMA org.myproj.hibernate.SchemaResolver org.myproj.hibernate.MultitenantConnectionProvider

  </props> 
     </property> 
    </bean> 

    <bean id = "transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

但是,每當我啓動了我的申請出現此日誌消息。

Initializing c3p0 pool... [email protected] [ connectionPoolDataSource -> [email protected] [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge0yw969iurgbvtwis0|6ee5f485, idleConnectionTestPeriod -> 3000, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 300, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> [email protected] [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hge0yw969iurgbvtwis0|ccd341d, jdbcUrl -> null, properties -> {} ], preferredTestQuery -> null, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hge0yw969iurgbvtwis0|53eba4b8, numHelperThreads -> 3 ] 

我相信我已經正確配置我的設置,任何想法如何調試或解決這個問題?

我得到的例外。

com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1418) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:682) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) 
    at org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:89) 
    at com.brightworks.genesis.client.config.hibernate.MultitenantConnectionProvider.getAnyConnection(MultitenantConnectionProvider.java:49) 
    at com.brightworks.genesis.client.config.hibernate.MultitenantConnectionProvider.getConnection(MultitenantConnectionProvider.java:55) 
    at org.hibernate.internal.AbstractSessionImpl$ContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:423) 
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) 
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:63) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1884) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1861) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:909) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) 
    at org.hibernate.loader.Loader.doList(Loader.java:2553) 
    at org.hibernate.loader.Loader.doList(Loader.java:2539) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369) 
    at org.hibernate.loader.Loader.list(Loader.java:2364) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) 
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495) 
    at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:71) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:360) 
    at com.sun.proxy.$Proxy52.getSingleResult(Unknown Source) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:197) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:74) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:97) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:88) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:421) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:381) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:512) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:111) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy41.findByUsername(Unknown Source) 
    at org.brightworks.genesis.commons.service.account.impl.AccountServiceImpl.findByUsername(AccountServiceImpl.java:25) 
    at com.brightworks.genesis.client.webapp.controller.ProductController.addProductForm(ProductController.java:34) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:769) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:144) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at com.googlecode.webutilities.filters.CompressionFilter.doFilter(CompressionFilter.java:131) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:497) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:610) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:539) 

而這一次

- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.lang.NullPointerException 
     at org.postgresql.Driver.parseURL(Driver.java:591) 
     at org.postgresql.Driver.acceptsURL(Driver.java:429) 
     at java.sql.DriverManager.getDriver(DriverManager.java:299) 
     at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:240) 
     at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:131) 
     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:156) 
     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:145) 
     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200) 
     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086) 
     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) 
     at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44) 
     at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810) 
     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648) 

這是我的MultiTenantIdentifier

public class MultitenantConnectionProvider implements MultiTenantConnectionProvider, ServiceRegistryAwareService { 

    private static final long serialVersionUID = 4368575201221677384L; 

    private C3P0ConnectionProvider connectionProvider = null; 

    @Override 
    public boolean supportsAggressiveRelease() { 
     return false; 
    } 

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

     connectionProvider = new C3P0ConnectionProvider(); 
     connectionProvider.injectServices(serviceRegistry); 
     connectionProvider.configure(lSettings); 

    } 

    @Override 
    public boolean isUnwrappableAs(Class clazz) { 
     return false; 
    } 

    @Override 
    public <T> T unwrap(Class<T> clazz) { 
     return null; 
    } 

    @Override 
    public Connection getAnyConnection() throws SQLException { 
     final Connection connection = connectionProvider.getConnection(); 
     return connection; 
    } 

    @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; 
    } 

    @Override 
    public void releaseAnyConnection(Connection connection) throws SQLException { 
     try { 
      connection.createStatement().execute("SET SCHEMA 'public'"); 
     } 
     catch (SQLException e) { 
      throw new HibernateException("Could not alter JDBC connection to specified schema [public]", e); 
     } 
     connectionProvider.closeConnection(connection); 
    } 

    @Override 
    public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException { 
     releaseAnyConnection(connection); 
    } 
} 

和我的架構解析器

public class SchemaResolver implements CurrentTenantIdentifierResolver { 

    @Override 
    public String resolveCurrentTenantIdentifier() { 

     return "tenant1"; //TODO: Implement service to identify tenant like: userService.getCurrentlyAuthUser().getTenantId(); 
    } 

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

編輯:

ADDTIONAL信息:

我設置爲我粘貼不被在運行時反映了XML的配置。在客戶端數據源中,我指定了jdbc url,但是在運行時檢查日誌時,它沒有被反映,因此'jdbc - > null'我粘貼了錯誤的配置,結果證明我使用SchemaResolver和MultiTenantConnection Provider將休眠配置爲Mutlti-tenancy

+0

問題是什麼?無法創建到數據庫的連接?是否有任何錯誤日誌或異常痕跡? – 2014-12-07 06:26:06

+0

@AndyDufresne我設置爲粘貼的XML的配置不會在運行時反映出來。在客戶端數據源的內部,我已經指定了jdbc url,但是在檢查日誌運行時,它並沒有被反映出來。 – KyelJmD 2014-12-07 07:41:17

+0

Duplicate:http://stackoverflow.com/q/27338535/330315 – 2014-12-07 08:03:15

回答

1

對於那些和我有同樣問題的人。這是我的發現和解決方案。

1.)基於我的XML配置,我已經配置了DataSource(在這種情況下,C3P0ComboPooledDataSource)。

2.)在我的MultiTenantIdentifier上,我再次配置了硬編碼的依賴關係,C3P0ConnectionProvider。配置將覆蓋我在clientDataSource bean上指定的配置。在此行配置C3P0ConnectionProvider at的配置。

<property name="jpaProperties"> 
      <props> 
.....</props> 
</property> 

在這種情況下,沒有JDBCURL,驅動程序等

結論,在clientDataSource我的bean的配置是由硬編碼的依賴性覆蓋。

解決方案。

而不是在我的MultitenantConnectionProvider中創建一個新的數據源。只需使用存在的唯一/由我的bean創建。像這樣

public class MultitenantConnectionProvider implements MultiTenantConnectionProvider, ServiceRegistryAwareService { 

    private static final long serialVersionUID = 4368575201221677384L; 

    private org.slf4j.Logger logger = LoggerFactory.getLogger(MultitenantConnectionProvider.class); 

    private DataSource lazyDatasource = null; 

    @Override 
    public boolean supportsAggressiveRelease() { 
     return false; 
    } 

    /** 
    * The DataSource/ConnectionPool we are using is the one configured by the environment 
    * Which by default, in our case, is configured at client-persistence-cfg.xml 
    * (named Client Data Source) 
    */ 
    @Override 
    public void injectServices(ServiceRegistryImplementor serviceRegistry) { 
     Map lSettings = serviceRegistry.getService(ConfigurationService.class).getSettings(); 
     lazyDatasource = (DataSource) lSettings.get(Environment.DATASOURCE); 
    } 

    @Override 
    public boolean isUnwrappableAs(Class clazz) { 
     return false; 
    } 

    @Override 
    public <T> T unwrap(Class<T> clazz) { 
     return null; 
    } 

    /** 
    * Retrieve any connection from the Connection Pool 
    */ 
    @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; 
    } 

    @Override 
    public void releaseAnyConnection(Connection connection) throws SQLException { 
     try { 
      connection.createStatement().execute("SET SCHEMA 'public'"); 
     } 
     catch (SQLException e) { 
      throw new HibernateException("Could not alter JDBC connection to specified schema [public]", e); 
     } 
     connection.close(); 
    } 

    @Override 
    public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException { 
     releaseAnyConnection(connection); 
    } 
} 

接下來是配置文件。

<bean id="clientDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${driver.className}"/> 
    <property name="jdbcUrl" value="${db.url}"/> 
    <property name="username" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 
    <property name="maximumPoolSize" value="30" /> 
    <property name="connectionTestQuery" value="SELECT 1" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="clientDataSource"/> 
    <property name="packagesToScan" value = "org.brightworks.genesis.commons.model"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="${hibernate.sql.dialect}" /> 
      <property name="showSql" value="true" /> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.multiTenancy">SCHEMA</prop> 
      <prop key="hibernate.tenant_identifier_resolver">com.myprojec.SchemaResolver</prop> 
      <prop key="hibernate.multi_tenant_connection_provider">com.myproj.hibernate.MultitenantConnectionProvider</prop> 
     </props> 
    </property> 
</bean> 

結論:只需檢索由Spring配置的當前/可用DataSource。