我正在研究支持Multi Tenancy的POC java应用程序.我用JHipster生成器开始我的POC,并在弹簧启动时启动OAUTH2认证.每个租户都有自己的SCHEMA,但租户和OAUTH2表是公开的.JHipster使用hibernate和Spring Data与DB连接.在我的例子中,我使用Mysql作为数据库.
我想用单个DataSource和单个连接池实现解决方案.连接池JHipster使用HikariCP.在MultiTenantConnectionProvider中,我想以类似于Hibernate doc describe的方式更改SCHEMA(参见例16.3).
http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html#d5e4866
当hibernate调用getConnection(String tenantIdentifier)时,我想在MYSQL数据库中设置正确的SCHEMA.我的实现使用Mysql命令来更改方案"USE sample_tenant_identifier".我必须使用名为"user"和"admin"的用户.每个用户都有自己的SCHEMA.我遇到的问题很奇怪.示例所有SELECT操作都使用"user"模式,但INSERT或UPDATE使用"admin"SCHEMA.结果"admin"查看"user"SCHEMA中的数据,但将数据INSERT到"admin"SCHEMA.
包com.mycompany.myapp.tenancy.hibernate;
import org.hibernate.HibernateException;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
/**
* Created by AdamS on 2015-04-02.
*/
public class SchemaMultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider, ServiceRegistryAwareService {
private final Logger log = LoggerFactory.getLogger(SchemaMultiTenantConnectionProviderImpl.class);
DataSource dataSource;
@Override
public Connection getAnyConnection() throws SQLException {
return this.dataSource.getConnection();
}
@Override
public void releaseAnyConnection(Connection connection) throws SQLException {
try {
connection.createStatement().execute("USE jhipster;");
} …Run Code Online (Sandbox Code Playgroud)