class MySQLSchemaHandler extends DefaultSchemaHandler {
MySQLSchemaHandler() {
super("USE `%s`", "CREATE SCHEMA `%s`", "contact_app")
}
@Override
Collection<String> resolveSchemaNames(DataSource dataSource) {
return ['tenant00']
}
}
这是注册新租户并为租户创建新架构的代码的片段部分。
Company save(Company company, Boolean registerTenant = false) { company.save(flush: true) log.info("company record ${company} was created successfully"); if(registerTenant) { this.registerTenantDatastore(company); } return company; } HibernateDatastore registerTenantDatastore(Company company) { hibernateDatastore.addTenantForSchema(company.tenantId); log.info("tenants=[${company.tenantId}] was added successfully..."); return hibernateDatastore }
我们正在运行一个带有数据库的多租户应用程序。显然可能存在差异。无论如何,在创建新数据库之后,我们既添加了Conection源和听众:
{
DatabaseConfiguration databaseConfiguration = findDatabaseConfigurationByShortName(shortName)
hibernateDatastore.connectionSources.addConnectionSource(databaseConfiguration.dataSourceName, databaseConfiguration.configuration)
addTenantListener(new TenantUserPasswordEncoderListener(getTenantDataStore(databaseConfiguration.dataSourceName)))
}
HibernateDatastore getTenantDataStore(String tenantName) {
HibernateDatastore tenantDatastore = hibernateDatastore.getDatastoreForConnection(tenantName)
log.info("getTenantDataStore($tenantName) == $tenantDatastore")
tenantDatastore
}
@CompileDynamic
boolean addTenantListener(AbstractPersistenceEventListener listener) {
log.debug("(${listener})")
boolean result = false
getGrailsApplication().mainContext.addApplicationListener(listener)
result = true
log.info("(${listener}) == ${result}")
result
}
DatabaseConfiguration findDatabaseConfigurationByShortName(String shortName) {
log.trace("findDatabaseConfigurationByShortName(${shortName})")
DatabaseConfiguration result = new DatabaseConfiguration(dataSourceName: shortName, configuration: configurationByShortName(shortName))
log.debug("findDatabaseConfigurationByShortName($shortName) .result.url == ${result.configuration.get('url')}")
result
}