我正在工作的Spring引导多租赁应用程序。我配置了多个数据源,如下所示:
spring.multitenancy.datasource1.url=jdbc:mysql://localhost:3306/db1
spring.multitenancy.datasource1.username=root
spring.multitenancy.datasource1.password=****
spring.multitenancy.datasource1.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.multitenancy.datasource2.url=jdbc:mysql://localhost:3306/db2
spring.multitenancy.datasource2.username=root
spring.multitenancy.datasource2.password=****
spring.multitenancy.datasource2.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.multitenancy.datasource3.url=jdbc:mysql://localhost:3306/db3
spring.multitenancy.datasource3.username=root
spring.multitenancy.datasource3.password=****
spring.multitenancy.datasource3.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
@Component
public class DataSourceBasedMultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
private static final long serialVersionUID = 8168907057647334460L;
private static final String DEFAULT_TENANT_ID = "tenant_1";
@Autowired
private DataSource dataSource1;
@Autowired
private DataSource dataSource2;
@Autowired
private DataSource dataSource3;
private Map<String, DataSource> map;
@PostConstruct
public void load() {
map = new HashMap<>();
map.put("tenant_1", dataSource1);
map.put("tenant_2", dataSource2);
map.put("tenant_3", dataSource3);
}
@Override
protected DataSource selectAnyDataSource() {
return map.get(DEFAULT_TENANT_ID);
}
@Override
protected DataSource selectDataSource(String tenantIdentifier) {
return map.get(tenantIdentifier);
}
}
@ConfigurationProperties("spring.multitenancy")
public class MultitenancyProperties {
@NestedConfigurationProperty
private DataSourceProperties datasource1;
@NestedConfigurationProperty
private DataSourceProperties datasource2;
@NestedConfigurationProperty
private DataSourceProperties datasource3;
public DataSourceProperties getDatasource1() {
return datasource1;
}
public void setDatasource1(DataSourceProperties datasource1) {
this.datasource1 = datasource1;
}
public DataSourceProperties getDatasource2() {
return datasource2;
}
public void setDatasource2(DataSourceProperties datasource2) {
this.datasource2 = datasource2;
}
public DataSourceProperties getDatasource3() {
return datasource3;
}
public void setDatasource3(DataSourceProperties datasource3) {
this.datasource3 = datasource3;
}
}
@Configuration
@EnableConfigurationProperties(JpaProperties.class)
public class MultiTenancyJpaConfiguration {
@Autowired
private DataSource dataSource;
@Autowired
private JpaProperties jpaProperties;
@Autowired
private MultiTenantConnectionProvider multiTenantConnectionProvider;
@Autowired
private CurrentTenantIdentifierResolver currentTenantIdentifierResolver;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
Map<String, Object> hibernateProps = new LinkedHashMap<>();
hibernateProps.putAll(jpaProperties.getHibernateProperties(dataSource));
hibernateProps.put(Environment.MULTI_TENANT, MultiTenancyStrategy.DATABASE);
hibernateProps.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
hibernateProps.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
hibernateProps.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
return builder.dataSource(dataSource).packages(HotelEntity.class.getPackage().getName()).properties(hibernateProps).jta(false).build();
}
}
应用程序启动程序
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(MultitenancyProperties.class)
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
运行启动应用程序时,所有表都只在第一个数据源中创建。
1)如何在应用程序启动时在所有数据源中创建表?
2)如何查看每个数据源打开/关闭的连接?
3)是否有更好的方法使用spring boot配置多租户应用程序以获得更好的性能?
正如@Alex所说,您需要不同的EntityManager、TransactionManager和DataSources。我会这样做
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "dataSource1EntityManagerFactory",
transactionManagerRef = "dataSource1TransactionManager",
basePackageClasses = dataSource1Repository.class)
public class DataSource1Config extends SqlConfig{// Put all common code in base class SqlConfig. If not remove it
@Bean
@Primary
public DataSource dataSource1() {
//create dataSource using MultitenancyProperties::getDataSource1
}
@Primary
@Bean(name = "dataSource1TransactionManager")
PlatformTransactionManager dataSource1TransactionManager(EntityManagerFactory dataSource1EntityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(dataSource1EntityManagerFactory);
return txManager;
}
@Primary
@Bean(name = "dataSource1EntityManagerFactory")
LocalContainerEntityManagerFactoryBean dataSource1EntityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource1());
em.setPackagesToScan(dataSource1Repository.class.getPackage().getName(), dataSource1ModelClass.class.getPackage().getName());
em.setPersistenceUnitName("dataSource1Db");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false);
em.setJpaVendorAdapter(vendorAdapter);
return em;
}
}
您可以像这样创建另外两个类。记住,只在datasource、transactionmanger和entitymanager的一个实例上使用@primary
(哪一个不重要)。另一个注意事项是,确保存储库类位于所有三个数据库的不同包中。
问题内容: 我已经在Sqllite Android应用程序中创建了一个数据库,并尝试在数据库中添加两个表,但是在创建该数据库时遇到了问题。仅创建第一张表。有谁能够帮我? 错误代码= 1否为客户提供此类表格 问题答案: 使用下面的类将值插入表
我正在将当前的应用程序迁移到多租户体系结构。由于只有一个代码库,我需要解决多个租户的问题。我使用的是单数据库、多模式的方法。每个租户将被分配一个单独的模式,其中元数据保存在默认模式中。 应用程序是用ASP构建的。NET MVC。我使用Dapper连接到我的SQL Server。我有50个函数,使用直接查询和存储过程调用数据库。当为每个租户初始化dapper时,是否有任何方法可以在不改变函数的情况下
所以,在我的开发Mac上使用我的rails应用程序创建了一个正常工作的postgres db实例,但是随着我从头开始构建模型(即添加、删除、更改列),迁移变得难以管理,所以我决定开始清理。运行rake db: dro后,我无法通过rake db: create重新创建。我只得到以下信息: 无法为 {“适配器”= 创建数据库 我想我需要在postgres中创建用户,但是它不应该从初始设置就存在吗?
我已经尝试了StackOverflow中给出的许多解决方案,比如中的一些更改、更改方言、设置模式等。我检查了数据库权限和用户/密码信息,一切正常。 } 根据我下面的教程,这个设置应该导致在postgres数据库中创建表,但它没有发生。
虽然我可以在其他项目中创建表,但这个项目不是从实体类创建表。我在使用eclipse的spring boot jpa中有以下实体类: 存储库类如下: 下面是属性文件: 但在没有任何错误地运行项目之后,我看不到在mySql工作台中创建的表。我试了很多次都没有成功。如果你找到解决办法,请告诉我。干杯
我被要求在一个非常大的SpringBoot项目中为一个服务创建一个集成测试,该项目产生了几十个已实现的服务。当应用程序执行时,所有这些服务都被部署了——我希望避免部署与我正在为其创建测试的服务无关的所有服务。不幸的是,我(还)没有像我希望的那样有很多Spring启动测试的经验,因此我想知道解决这个问题的最佳方法是什么。 我曾考虑在测试类中使用注释对所有不相关的服务进行注释,并使用对所有相关服务进行