springboot实现动态分库

阅读: 评论:0

springboot实现动态分库

springboot实现动态分库

前段时间公司要开发一套企业级的Saas系统,为了方便部署和迁移因此每个企业的数据库是独立的,数据库之间没有关联。库以及表动态创建的,只有用户注册后才会动态创建。

该功能实现起来比较简单,因为数据库是独立的,因此不需要考虑事务问题、跨库查询等分库分表的常见问题。但是因为因为云端部署多个数据库成本很高并且会造资源浪费,因此采用的是逻辑分库的方式及创建多个schema的方式进行分库。

我们目前使用的开发架构是springboot+mybatis,但是mybatis无法满足动态schema的需求,因此改用Springboot+SpringJDBC的方式。

主要的依赖如下:

    <dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>

JdbcTemplate本身并不支持动态设置schema的功能,因此需要重新改造JdbcTemplate使其支持逻辑schema的动态设置。
在这里只展示部分代码,如果想查看全部代码可以下载查看。。

@Override
@Nullable
public <T> T execute(StatementCallback<T> action, String schema) throws DataAccessException {Null(action, "Callback object must not be null");Connection con = Connection(obtainDataSource());try {con.setCatalog(schema);} catch (SQLException e) {e.printStackTrace();}try {con.setCatalog(schema);} catch (SQLException e) {e.printStackTrace();}Statement stmt = null;try {stmt = ateStatement();applyStatementSettings(stmt);T result = action.doInStatement(stmt);handleWarnings(stmt);return result;}catch (SQLException ex) {// Release Connection early, to avoid potential connection pool deadlock// in the case when the exception translator hasn't been initialized yet.String sql = getSql(action);JdbcUtils.closeStatement(stmt);stmt = leaseConnection(con, getDataSource());con = null;throw translateException("StatementCallback", sql, ex);}finally {JdbcUtils.closeStatement(stmt);leaseConnection(con, getDataSource());}
}

接下来就可以根据自身业务动态设置schema了

List<Map<String,Object>>  list1= db1JdbcTemplate.queryForList("select * from user","demo_ds_0");
List<Map<String,Object>>  list2= db1JdbcTemplate.queryForList("select * from db_info","demo_ds_1");
其中demo_ds_0、demo_ds_0是逻辑分库。

通过Springboot将MyJdbcTemplate注入。

@Bean(name = "db1JdbcTemplate")
public MyJdbcTemplate Db1JdbcTemplate(@Qualifier("db1DataSource")DataSource dataSource) {return new MyJdbcTemplate(dataSource);
}@Primary
@Bean(name = "db1DataSourceProperties")
@Qualifier("db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSourceProperties db1DataSourceProperties() {return new DataSourceProperties();
}@Primary
@Bean(name = "db1DataSource")
@Qualifier("db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource db1DataSource() {return db1DataSourceProperties().initializeDataSourceBuilder().build();
}

同时SpringJDBC支持多数据源,这样一来业务基本满足。

本文发布于:2024-01-28 01:40:03,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063772113897.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:动态   springboot
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23