既有项目修改shardingshpere分库分表踩坑记(一)

背景

在既有项目使用shardingshpere分库分表改造后。发现有些sql(例如:select * from order join user )还需要关联单表(举例user表),user表没有做任何配置,故是单表,其他库查sql的话是找不到user表的,所以会报错。
由于用户角色模块是单独的自研的工程配置的。工程还没有分表分库配置。对方也没打算改。所以只能自己想办法。

解决方案

首先想到将业务sql拆分,将user表关联查询的修改,分两次查询,第一次查主库的用户信息,再将用户信息当成条件查具体业务。由于改动太多,还是暂时放弃。
接下来就考虑将user表配置成广播表。但是由于修改只会修改主库,所以需要实时的将主库的user表数据同步到其他库的user表。
这里考虑过一些实时同步与跨库连接,最终选择跨库连接实现跨库视图。

跨库视图模板

create or replace
view public.【目标库表名】 as
select
	*
from
	dblink('host=【源库ip】 port=【源库端口】 dbname=【源库数据库名】 user=【源库用户名】 password=【源库密码】'::text,
	'select t.id,t.username from user1 as t'::text) user1_temp(id varchar,
	username varchar,
	);

要一个个表增加,明显不科学,所以写了个sql脚本可以批量生成跨库视图

select concat(
'CREATE OR REPLACE VIEW public.'
,table_name
,' as select '
, ' * '
,' FROM dblink(''host=127.0.0.1 port=5432 dbname=test user=test password=123456''::text, '
,'''select '
,string_agg (concat('t.',column_name) , ',' order by ordinal_position)
,' from '
,table_name
,' as t''::text) '
,table_name
,'_temp('
, string_agg(concat(column_name,' ',udt_name) ,',' order by ordinal_position)
,');'
)  
from information_schema.columns A where table_schema = 'public' and table_name in(
'user'
)
group by table_name;

最后,需要修改下配置文件增加广播表配置

spring.shardingsphere.sharding.broadcast-tables=\
    user
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值