总结一下,这就是我的以下内容。我使用一个简单的CurrentTenantIdentifierResolver。并且没有尝试将数据源从其他地方注入到我的MultiTenantConnectionProviderImpl中,而是在ConnectionProvider中创建了DataSource(c3p0
ComboPooledDatasource),并仅使用了由我的ConnectionProvider提供的连接。因此,我消除了多余的DataSource。为了使DataSource的属性易于配置,我选择从属性文件中获取配置数据。
CurrentTenantIdentifierResolverImpl:
public class CurrentTenantIdentifierResolverImpl implements CurrentTenantIdentifierResolver { @Override public String resolveCurrentTenantIdentifier() { if (FacesContext.getCurrentInstance() != null){ return FacesContext.getCurrentInstance().getExternalContext().getRequestServerName(); } else { return null; } } @Override public boolean validateExistingCurrentSessions() { return true; }}MultiTenantConnectionProviderImpl:
请注意,PropertyUtil只是一个简单的本地帮助程序类,用于获取我的属性。由于没有什么特别之处,因此我不会将其包括在内以免弄乱答案。
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider { private static final long serialVersionUID = 8074002161278796379L; private static Logger log = LoggerFactory.getLogger(MultiTenantConnectionProviderImpl.class ); private ComboPooledDataSource cpds; private Properties properties; public MultiTenantConnectionProviderImpl() throws PropertyVetoException { log.info("Initializing Connection Pool!"); properties = new Properties(); try { properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties")); } catch (IOException e) { throw new RuntimeException(e); } cpds = new ComboPooledDataSource("Example"); cpds.setDriverClass(properties.getProperty("jdbc.driver")); cpds.setJdbcUrl(properties.getProperty("jdbc.url")); cpds.setUser(properties.getProperty("jdbc.user")); cpds.setPassword(PropertyUtil.getCredential("jdbc.password")); log.info("Connection Pool initialised!"); } @Override public Connection getAnyConnection() throws SQLException { log.debug("Get Default Connection:::Number of connections (max: busy - idle): {} : {} - {}",new int[]{cpds.getMaxPoolSize(),cpds.getNumBusyConnectionsAllUsers(),cpds.getNumIdleConnectionsAllUsers()}); if (cpds.getNumConnectionsAllUsers() == cpds.getMaxPoolSize()){ log.warn("Maximum number of connections opened"); } if (cpds.getNumConnectionsAllUsers() == cpds.getMaxPoolSize() && cpds.getNumIdleConnectionsAllUsers()==0){ log.error("Connection pool empty!"); } return cpds.getConnection(); } @Override public Connection getConnection(String tenantIdentifier) throws SQLException { log.debug("Get {} Connection:::Number of connections (max: busy - idle): {} : {} - {}",new Object[]{tenantIdentifier, cpds.getMaxPoolSize(),cpds.getNumBusyConnectionsAllUsers(),cpds.getNumIdleConnectionsAllUsers()}); if (cpds.getNumConnectionsAllUsers() == cpds.getMaxPoolSize()){ log.warn("Maximum number of connections opened"); } if (cpds.getNumConnectionsAllUsers() == cpds.getMaxPoolSize() && cpds.getNumIdleConnectionsAllUsers()==0){ log.error("Connection pool empty!"); } return cpds.getConnection(tenantIdentifier, PropertyUtil.getCredential(tenantIdentifier)); } @Override public void releaseAnyConnection(Connection connection) throws SQLException { connection.close(); } @Override public void releaseConnection(String tenantIdentifier, Connection connection){ try { this.releaseAnyConnection(connection); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public boolean supportsAggressiveRelease() { return false; } @SuppressWarnings("rawtypes") @Override public boolean isUnwrappableAs(Class unwrapType) { return ConnectionProvider.class.equals( unwrapType ) || MultiTenantConnectionProvider.class.equals( unwrapType ) || MultiTenantConnectionProviderImpl.class.isAssignableFrom( unwrapType ); } @SuppressWarnings("unchecked") @Override public <T> T unwrap(Class<T> unwrapType) { if ( isUnwrappableAs( unwrapType ) ) { return (T) this; } else { throw new UnknownUnwrapTypeException( unwrapType ); } }}特定于 c3p0的 配置来自 c3p0-config.xml :
<c3p0-config> <named-config name="Example"> <property name="acquireIncrement">3</property> <property name="preferredTestQuery">SELECT 1</property> <property name="checkoutTimeout">2000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">1</property> <property name="maxIdleTime">18000</property> <property name="maxPoolSize">30</property> <property name="minPoolSize">1</property> <property name="maxStatements">50</property> <property name="testConnectionOnCheckin">true</property> </named-config></c3p0-config>
db特定的属性由 config.properties 文件提供:
jdbc.url=<serverUrl>jdbc.driver=<driverClass>jdbc.dbName=<dBname>jdbc.dbowner=<dbo>jdbc.username=<user>jdbc.password=<password>hibernate.dialect=<hibernateDialect>hibernate.debug=false
从另一个文件以类似的方式获取凭据。
任何提供改进的反馈意见表示赞赏。



