当前位置: 首页 > news >正文

企业网站备案容易吗深圳网络营销推广专员

企业网站备案容易吗,深圳网络营销推广专员,沈阳有限公司,安徽网络推广排名一、前言 之前的例子中#xff0c;我们以一个简化了的销售单报表查询#xff0c;展示了大数据量查询时#xff0c;在索引和变量类型层面可以做的一些优化。可我们发现#xff0c;无论怎么优化#xff0c;一次查询都要好几秒。 这是一个现实问题#xff0c;只要一个系统用…一、前言 之前的例子中我们以一个简化了的销售单报表查询展示了大数据量查询时在索引和变量类型层面可以做的一些优化。可我们发现无论怎么优化一次查询都要好几秒。 这是一个现实问题只要一个系统用户的业务足够多运行时间足够长数据库的单张表中就会存在海量的数据。数据量大到一定程度无论怎么做性能都会下降。那是否有解决方法呢 最容易想到的就是分库分表了。其实在这个业务中第一章已经给出了一个分库的方案把不同用户放在不同的库中。然而单个用户的数据也可能较大这时就需要分表了。 本节就介绍市面上最主流的分库分表方案shardingsphere。 二、代码展示 由于本节原理部分讲的很少多数仅仅介绍shardingsphere如何使用。而该框架学习的难点仅仅在如何配置理论部分涉及很少故这次在开始位置直接给出代码展示大家可以看着代码再看我后面的介绍。 三、shardingsphere配置 3.1 版本 本节使用的shardingsphere版本引用如下 dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc/artifactIdversion5.5.1/version/dependency3.2 yml配置 shardingsphere有一个复杂的yml配置我们先看官方文档的介绍。 其实看着官方文档还是很复杂而且配置时总觉得心慌我们可以看着源码做配置。由于我们本次也牵扯监控中心和企业中心监控中心是不分表的所以用SpringBoot的默认数据源即可。所以本次数据要我们手动配置。创建shardingsphere数据源的核心代码为 Bean(name shardingSphereDataSource)public DataSource shardingSphereDataSource() throws SQLException, IOException {File file new File(getClass().getClassLoader().getResource(shardingsphere.yml).getFile());DataSource dataSource YamlShardingSphereDataSourceFactory.createDataSource(file);return dataSource;}我们点进去这个YamlShardingSphereDataSourceFactory可以看到配置类核心是这个结构体 Getter Setter public final class YamlJDBCConfiguration implements YamlConfiguration {private String databaseName;private MapString, MapString, Object dataSources new HashMap();private CollectionYamlRuleConfiguration rules new LinkedList();private YamlModeConfiguration mode;private YamlAuthorityRuleConfiguration authority;private YamlSQLParserRuleConfiguration sqlParser;private YamlTransactionRuleConfiguration transaction;private YamlGlobalClockRuleConfiguration globalClock;private YamlSQLFederationRuleConfiguration sqlFederation;private YamlSQLTranslatorRuleConfiguration sqlTranslator;private YamlLoggingRuleConfiguration logging;private Properties props new Properties();......}这里面的变量名则是我们yml第一层的配置。我们本节只讲本例中用到的配置其他细节大家可以看着官网仔细学习。 变量名称作用databaseName数据源名配置数据源的名称如果不是自动配置的这个其实没啥用dataSources数据源在该节点下配置多个数据源mode模式是单机模式还是集群模式本例子配单机Standalone还有配连接类型本例配JDBCrule规则该段配置是重中之重配置分库分表的规则。该配置是一个数组每种类型规则可以配一个props变量一些sharding框架用的变量本例中用于开启log信息 3.3 规则配置 我们对YamlRuleConfiguration这个类ctrl H可以看到每种规则的类这样可以确定我们每种规则具体该怎么配置。 shardingsphere的规则配置中数组元素对应哪个类使用shardingsphere的一个特有的注释如数据分片的配置是- !SHARDING 我们可以在官方文档中查看每种规则配置的注释这里给出本例用到的配置 类型类名类型注释作用YamlShardingRuleConfiguration分片规则- !SHARDING用于描述如何分库分表YamlSingleRuleConfiguration单表规则- !SINGLE用于扫描库中有哪些表可以配置通配YamlBroadcastRuleConfiguration广播表规则- !BROADCAST用于描述哪些表会被用作连表并且该表是没做分表的 3.3.1 分片规则 分片规则怎么配我们可以结合官网文档和源码来看 官网文档 rules: - !SHARDINGtables: # 数据分片规则配置logic_table_name (): # 逻辑表名称actualDataNodes (?): # 由数据源名 表名组成参考 Inline 语法规则databaseStrategy (?): # 分库策略缺省表示使用默认分库策略以下的分片策略只能选其一standard: # 用于单分片键的标准分片场景shardingColumn: # 分片列名称shardingAlgorithmName: # 分片算法名称complex: # 用于多分片键的复合分片场景shardingColumns: # 分片列名称多个列以逗号分隔shardingAlgorithmName: # 分片算法名称hint: # Hint 分片策略shardingAlgorithmName: # 分片算法名称none: # 不分片tableStrategy: # 分表策略同分库策略keyGenerateStrategy: # 分布式序列策略column: # 自增列名称缺省表示不使用自增主键生成器keyGeneratorName: # 分布式序列算法名称auditStrategy: # 分片审计策略auditorNames: # 分片审计算法名称- auditor_name- auditor_nameallowHintDisable: true # 是否禁用分片审计hintautoTables: # 自动分片表规则配置t_order_auto: # 逻辑表名称actualDataSources (?): # 数据源名称shardingStrategy: # 切分策略standard: # 用于单分片键的标准分片场景shardingColumn: # 分片列名称shardingAlgorithmName: # 自动分片算法名称bindingTables (): # 绑定表规则列表- logic_table_name_1, logic_table_name_2, ... - logic_table_name_1, logic_table_name_2, ... defaultDatabaseStrategy: # 默认数据库分片策略defaultTableStrategy: # 默认表分片策略defaultKeyGenerateStrategy: # 默认的分布式序列策略defaultShardingColumn: # 默认分片列名称# 分片算法配置shardingAlgorithms:sharding_algorithm_name (): # 分片算法名称type: # 分片算法类型props: # 分片算法属性配置# ...# 分布式序列算法配置keyGenerators:key_generate_algorithm_name (): # 分布式序列算法名称type: # 分布式序列算法类型props: # 分布式序列算法属性配置# ...# 分片审计算法配置auditors:sharding_audit_algorithm_name (): # 分片审计算法名称type: # 分片审计算法类型props: # 分片审计算法属性配置# ...- !BROADCASTtables: # 广播表规则列表- table_name- table_name源码 RepositoryTupleEntity(sharding) Getter Setter public final class YamlShardingRuleConfiguration implements YamlRuleConfiguration {RepositoryTupleField(type Type.TABLE)private MapString, YamlTableRuleConfiguration tables new LinkedHashMap();RepositoryTupleField(type Type.TABLE)private MapString, YamlShardingAutoTableRuleConfiguration autoTables new LinkedHashMap();RepositoryTupleField(type Type.TABLE)RepositoryTupleKeyListNameGenerator(ShardingBindingTableRepositoryTupleKeyListNameGenerator.class)private CollectionString bindingTables new LinkedList();RepositoryTupleField(type Type.DEFAULT_STRATEGY)private YamlShardingStrategyConfiguration defaultDatabaseStrategy;RepositoryTupleField(type Type.DEFAULT_STRATEGY)private YamlShardingStrategyConfiguration defaultTableStrategy;RepositoryTupleField(type Type.DEFAULT_STRATEGY)private YamlKeyGenerateStrategyConfiguration defaultKeyGenerateStrategy;RepositoryTupleField(type Type.DEFAULT_STRATEGY)private YamlShardingAuditStrategyConfiguration defaultAuditStrategy;RepositoryTupleField(type Type.ALGORITHM)private MapString, YamlAlgorithmConfiguration shardingAlgorithms new LinkedHashMap();RepositoryTupleField(type Type.ALGORITHM)private MapString, YamlAlgorithmConfiguration keyGenerators new LinkedHashMap();RepositoryTupleField(type Type.ALGORITHM)private MapString, YamlAlgorithmConfiguration auditors new LinkedHashMap();RepositoryTupleField(type Type.OTHER)private String defaultShardingColumn;RepositoryTupleField(type Type.OTHER)private YamlShardingCacheConfiguration shardingCache;Overridepublic ClassShardingRuleConfiguration getRuleConfigurationType() {return ShardingRuleConfiguration.class;} }这里文档基本写的很清楚了大家看着文档配就行了。 这里主要讲解一下actualDataNodes的表达式 我们需要告诉shardingsphere一个逻辑表可能出现的实际表有哪些以便在连表查询时shardingsphere帮我们做关联。自定义分表算法的回调中也能获取到这些值虽然可能用不到。 以本例中的配置为例 consign:#logicTable: consignactualDataNodes: ds${0..1}.consign_${2022..2024}${1..4},ds${0..1}.consign_0tableStrategy:standard:shardingAlgorithmName: year-month-shardingshardingColumn: bill_time_key可以使用${}的形式展示可能出现哪些情况。由于shardingsphere的设计问题这里必须是数字后面会讲解为什么。多种不同的可能可以用,分割。 注意要实现分库分表时的join操作正常要把可能join的组合配置到bindingTables中不然两个分表了的表join该出现笛卡尔积了。 3.3.2 单表规则 这个配置必须配不然只能查询到分片配置中已经配的逻辑表会非常难绷。报错信息如下 Cause: org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException: Table or view item does not exist.该配置可以用通配符如 - !SINGLEtables:# 加载全部单表- ds0.*3.3.3 广播表配置 如果连表时分表了的表和没分表的表做连表如本例中的consign连item并且没有配置分库的列时就会报如下错误 ### Cause: java.sql.SQLException: Unknown exception. More details: java.lang.NullPointerException: Cannot invoke String.equalsIgnoreCase(String) because shardingColumn is null ; uncategorized SQLException; SQL state [HY000]; error code [30000]; Unknown exception.此时把item配进去即可 - !BROADCASTtables: # 广播表规则列表- item3.4 本例完整的配置 mode:type: Standalonerepository:type: JDBC databaseName: mysql dataSources:ds0:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.0.64:3306/study2024-class009-busy001?useUnicodetruecharacterEncodingutf-8useSSLfalseusername: dbMgrpassword: qqhilvMgAl7ds1:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.0.64:3306/study2024-class009-busy002?useUnicodetruecharacterEncodingutf-8useSSLfalseusername: dbMgrpassword: qqhilvMgAl7 rules:- !SHARDINGdefaultDatabaseStrategy:standard:shardingAlgorithmName: enterprise-shardingshardingColumn: enp_iddefaultTableStrategy:none:shardingAlgorithms:year-month-sharding:type: CUSTOM_YEAR_MONTHenterprise-sharding:type: ENTERPRISE-SHARDINGtables:consign:#logicTable: consignactualDataNodes: ds${0..1}.consign_${2022..2024}${1..4},ds${0..1}.consign_0tableStrategy:standard:shardingAlgorithmName: year-month-shardingshardingColumn: bill_time_keyconsign_header:#logicTable: consign_headeractualDataNodes: ds${0..1}.consign_header_${2022..2024}${1..4},ds${0..1}.consign_header_0tableStrategy:standard:shardingAlgorithmName: year-month-shardingshardingColumn: bill_time_keybindingTables:- consign_header,consign- !SINGLEtables:# 加载全部单表- ds0.*- !BROADCASTtables: # 广播表规则列表- item props:sql-show: true四、自定义分片算法 在实际开发中我们通常不会使用系统自带的算法。我们都会做一个自己的分片规则。 4.1 算法编写 在本例中我们写了两个分片算法一个是表的分片根据年份和季度。另一个是数据库的分片根据jwt中的库信息告诉系统去哪个库中查询。这里我们先展示代码再进行讲解。 4.1.1 YearMonthTableShardingAlgorithm public class YearMonthTableShardingAlgorithm implements StandardShardingAlgorithmLong {Overridepublic String doSharding(CollectionString availableTargetNames, PreciseShardingValueLong shardingValue) {String tableName shardingValue.getLogicTableName();Long billTimeSecond shardingValue.getValue();LocalDateTime localDateTime CommonUtil.parseFromSecond(billTimeSecond);int year localDateTime.getYear();int monVal localDateTime.getMonthValue();int season (monVal2)/3;if(year 2022){return tableName_0;}else{return tableName_yearseason;}}Overridepublic CollectionString doSharding(CollectionString collection, RangeShardingValueLong rangeShardingValue) {ListString rtn new ArrayListString();String tableName rangeShardingValue.getLogicTableName();Long begTimeL rangeShardingValue.getValueRange().lowerEndpoint();Long endTimeL rangeShardingValue.getValueRange().upperEndpoint();LocalDateTime beginTime CommonUtil.parseFromSecond(begTimeL);LocalDateTime endTime CommonUtil.parseFromSecond(endTimeL);int yearBeg beginTime.getYear();int yearEnd endTime.getYear();int monBeg beginTime.getMonthValue();int monEnd endTime.getMonthValue();int seasonBeg (monBeg2)/3;int seasonEnd (monEnd2)/3;if(yearBeg 2022){rtn.add(tableName_0);seasonBeg 1;yearBeg 2022;}for(int i yearBeg; i yearEnd; i){int curSeasonBeg i yearBeg ? 1: seasonBeg;int curSeasonEnd i yearEnd ? 4 : seasonEnd;for(int j curSeasonBeg; j curSeasonEnd; j){rtn.add(tableName_ij);}}return rtn;}Overridepublic String getType() {return CUSTOM_YEAR_MONTH; // 自定义算法类型名称}}4.1.2 YearMonthTableShardingAlgorithm Slf4j public class EnterpriseShardingAlgorithm implements StandardShardingAlgorithmLong {Overridepublic String getType() {return ENTERPRISE-SHARDING; // 自定义算法类型名称}Overridepublic String doSharding(CollectionString availableTargetNames, PreciseShardingValueLong shardingValue) {ITokenUtil tokenUtil SpringUtil.getBean(ITokenUtil.class);String prompt DatasourceSetUtil.getDbPrompt();if(StringUtils.hasText(prompt)){return prompt;}if(tokenUtil.hasTokenObject()){AuthObject authObject tokenUtil.getAuthObject();return authObject.getDbCode();}return ds0;}Overridepublic CollectionString doSharding(CollectionString availableTargetNames, RangeShardingValueLong shardingValue) {String prompt DatasourceSetUtil.getDbPrompt();if(StringUtils.hasText(prompt)){return List.of(prompt);}ITokenUtil tokenUtil SpringUtil.getBean(ITokenUtil.class);if(tokenUtil.hasTokenObject()){AuthObject authObject tokenUtil.getAuthObject();return List.of(authObject.getDbCode());}return List.of(ds0);} }4.1.3 讲解 这里我们继承了StandardShardingAlgorithm其实还可以继承ComplexKeysShardingAlgorithm或HintShardingAlgorithm具体用法大家可以参见官方文档。我们这里仅详细讲下StandardShardingAlgorithm。 第一个回调doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) 该回调用于处理equal时的分片。而doSharding(Collection collection, RangeShardingValue rangeShardingValue)用于处理范围查询时的分片。 getType回调用于标识算法的名字用于和配置关联。 4.2 meta-info的配置 仅仅写了算法系统还不能识别需要在Resource下的META-INFO.service中配置都有哪些类是算法。 indi.zhifa.study2024.common.auth.sharding.YearMonthTableShardingAlgorithm indi.zhifa.study2024.common.auth.sharding.EnterpriseShardingAlgorithm五、数据源配置 如果手动配置数据源并且结合mp使用还是要在配置SqlSessionFactory时像之前讲的一样参考mp的自动配置做一系列的操作。这里就不在帖子中展示那些冗余代码了大家去参考代码中看。这里仅展示核心内容 Bean(name shardingSphereDataSource)public DataSource shardingSphereDataSource() throws SQLException, IOException {File file new File(getClass().getClassLoader().getResource(shardingsphere.yml).getFile());DataSource dataSource YamlShardingSphereDataSourceFactory.createDataSource(file);return dataSource;}Bean(name shardingSqlSessionFactory)public SqlSessionFactory shardingSqlSessionFactory(Qualifier(shardingSphereDataSource) DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean factory new MybatisSqlSessionFactoryBean();factory.setDataSource(dataSource);enableMpSqlSessionFactory(factory);return factory.getObject();}PrimaryBean(name shardingTransactionManager)public PlatformTransactionManager shardingTransactionManager(Qualifier(shardingSphereDataSource) DataSource monitorDataSource) {return new DataSourceTransactionManager(monitorDataSource);}六、遇到的坑 shardingsphere分表时有个坑表名必须为 逻辑名_数字 如consign_20221千万不能写成consign_2022_1不然在bindingTables的配置的检测过程时会出错。 代码在文件 org.apache.shardingsphere.sharding.rule.checker.ShardingRuleChecker private boolean isValidActualTableName(final ShardingTable sampleShardingTable, final ShardingTable shardingTable) {for (String each : sampleShardingTable.getActualDataSourceNames()) {CollectionString sampleActualTableNames sampleShardingTable.getActualTableNames(each).stream().map(actualTableName - actualTableName.replace(sampleShardingTable.getTableDataNode().getPrefix(), )).collect(Collectors.toSet());CollectionString actualTableNames shardingTable.getActualTableNames(each).stream().map(optional - optional.replace(shardingTable.getTableDataNode().getPrefix(), )).collect(Collectors.toSet());if (!sampleActualTableNames.equals(actualTableNames)) {return false;}}return true;}我认为这个设定十分不合理但也没办法先做记录。
http://www.dnsts.com.cn/news/12677.html

相关文章:

  • 哪些网站可以医生做兼职莆田网站建设方法
  • 广州网站推广服务展示型网站
  • 简单的网站制作代码ps网站logo制作教程
  • 厦门启明星网站建设榆林市城乡建设规划局网站
  • 荣成建设局网站网站底部代码大全
  • 宠物主题网站模板北京网站设计技术
  • 邹平做网站哪家好重庆专业网站定制
  • 电子商务网站建设与维护课件小程序搭建是什么工作
  • 唐山网站托管山西网站建设找哪家
  • 谷歌优化方法seo网络推广怎么做
  • 静态网站首页更新网站首页页脚设计
  • 永嘉网站制作公司搜索引擎大全排行榜
  • 让别人做的网站不给源代码wordpress云存储
  • 网站建设哪方面最重要的呢网站集约化建设工作打算
  • 网站建设阶段百度做网站吗
  • 无锡网站制作哪家公司好中国纪检监察报社地址
  • 网站在百度搜不到网站分析模板
  • 新网站建设 英文翻译网站建设管理是
  • 移动端网站建设重点有哪些网络推广运营
  • 网站开发如何搭建框架如何k掉网站
  • 网站友链是什么情况破解wordpress后台密码
  • 可信网站 quot 验证能防范哪些安全.自己公司网站维护
  • 用c 做网站网站需要建手机版的吗
  • 可以做女的游戏视频网站学做网站有没有前途
  • 百度网站快速排名公司电子商务网站建设c
  • 网站前端设计与制作ppt郑州千锋教育
  • 宜兴网站开发的wordpress主题
  • h5网站动画怎么做的房地产设计部岗位职责
  • 网站qq 微信分享怎么做的wordpress 重复内容
  • 京东网站开发技术网站是公司域名是个人可以吗