文章目录
一.基本概念
二. ShardingSphere-JDBC读写分离
2.1 一主多从配置
2.2 核心配置
2.3 事务
三.ShardingSphere-JDBC垂直分片
四.ShardingSphere-JDBC水平分片
4.1 数据库
4.2 基本配置
4.3 标椎分片表配置
4.4 分片算法配置
4.5 分布式序列算法
4.6 多表关联
一.基本概念
1.1 垂直切分
垂直切分包括垂直分表和垂直分库;
垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库,类似于微服务项目中根据业务创建不同的服务
垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。 优缺点
优点:
1.可根据业务进行拆分 2.便于对不同业务的数据进行管理和维护 3.高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈
缺点:
1.部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度 2.分布式事务处理复杂 3.依然存在单表数据量过大的问题(需要水平切分)
1.2 水平切分
当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了。 水平切分包括水平分表和水平分库;
水平分表 将同一个表按不同的条件分散到多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小. 库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。
水平分库
优缺点
优点:
1.不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力 2.应用端改造较小,不需要拆分业务模块
缺点:
1.跨分片的事务一致性难以保证 2.跨库的join关联查询性能较差 3.数据多次扩展难度和维护量极大
1.3 应用
(1)在数据库设计时候考虑垂直分库和垂直分表 (2)随着数据库数据量增加,不要马上考虑做水平切分,首先考虑缓存处理,读写分离,使用索引等等方式,如果这些方式不能根本解决问题了,再考虑做水平分库和水平分表
二. ShardingSphere-JDBC读写分离
2.1 一主多从配置
具体配置过程可参考下面文章
参考链接
binlog格式说明:
binlog_format=STATEMENT:日志记录的是主机数据库的写指令
,性能高,但是now()之类的函数以及获取系统参数的操作会出现主从数据不同步的问题。
binlog_format=ROW(默认):日志记录的是主机数据库的写后的数据
,批量操作时性能较差,解决now()或者 user()或者 @@hostname 等操作在主从机器上不一致的问题。
binlog_format=MIXED:是以上两种level的混合使用,有函数用ROW,没函数用STATEMENT,但是无法识别系统变量
binlog-ignore-db和binlog-do-db的优先级问题:
2.2 核心配置
# 应用名称
spring. application. name= sharging- jdbc- demo
# 开发环境设置
spring. profiles. active= dev
# 内存模式
spring. shardingsphere. mode. type= Memory
# 配置真实数据源
spring. shardingsphere. datasource. names= master, slave1, slave2
# 配置第 1 个数据源
spring. shardingsphere. datasource. master. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. master. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3307 / test? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. master. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. master. username= root
spring. shardingsphere. datasource. master. password= root
# 配置第 2 个数据源
spring. shardingsphere. datasource. slave1. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. slave1. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3308 / test? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. slave1. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. slave1. username= root
spring. shardingsphere. datasource. slave1. password= root
# 配置第 3 个数据源
spring. shardingsphere. datasource. slave2. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. slave2. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3309 / test? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. slave2. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. slave2. username= root
spring. shardingsphere. datasource. slave2. password= root
# 读写分离类型,如: Static ,Dynamic
spring. shardingsphere. rules. readwrite- splitting. data- sources. myds. type= Static
# 写数据源名称
spring. shardingsphere. rules. readwrite- splitting. data- sources. myds. props. write- data- source- name= master
# 读数据源名称,多个从数据源用逗号分隔
spring. shardingsphere. rules. readwrite- splitting. data- sources. myds. props. read- data- source- names= slave1, slave2
# 负载均衡算法名称
spring. shardingsphere. rules. readwrite- splitting. data- sources. myds. load- balancer- name= alg_round
# 负载均衡算法配置
# 负载均衡算法类型
spring. shardingsphere. rules. readwrite- splitting. load- balancers. alg_round. type= ROUND_ROBIN
spring. shardingsphere. rules. readwrite- splitting. load- balancers. alg_random. type= RANDOM
spring. shardingsphere. rules. readwrite- splitting. load- balancers. alg_weight. type= WEIGHT
spring. shardingsphere. rules. readwrite- splitting. load- balancers. alg_weight. props. slave1= 1
spring. shardingsphere. rules. readwrite- splitting. load- balancers. alg_weight. props. slave2= 2
# 打印SQl
spring. shardingsphere. props. sql- show= true
2.3 事务
为了保证主从库间的事务一致性,避免跨服务的分布式事务,ShardingSphere-JDBC的主从模型中,事务中的数据读写均用主库
。
不添加@Transactional:insert对主库操作,select对从库操作
添加@Transactional:则insert和select均对主库操作
注意:在JUnit环境下的@Transactional注解,默认情况下就会对事务进行回滚(即使在没加注解@Rollback,也会对事务回滚)
三.ShardingSphere-JDBC垂直分片
3.1 数据库
3.2 核心配置
# 应用名称
spring. application. name= sharding- jdbc- demo
# 环境设置
spring. profiles. active= dev
# 配置真实数据源
spring. shardingsphere. datasource. names= user, order
# 配置第 1 个数据源
spring. shardingsphere. datasource. user. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. user. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. user. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3307 / test? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. user. username= root
spring. shardingsphere. datasource. user. password= root
# 配置第 2 个数据源
spring. shardingsphere. datasource. order. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. order. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. order. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3306 / gu? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. order. username= root
spring. shardingsphere. datasource. order. password= root
# 标准分片表配置(数据节点)
# spring. shardingsphere. rules. sharding. tables. -name> . actual- data- nodes= 值
# 值由数据源名 + 表名组成,以小数点分隔。
# < table- name> :逻辑表名
spring. shardingsphere. rules. sharding. tables. t_user. actual- data- nodes= user. t_user
spring. shardingsphere. rules. sharding. tables. t_order. actual- data- nodes= order. t_order
# 打印SQL
spring. shardingsphere. props. sql- show= true
3.3 测试
@Test
public void testInsertOrderAndUser ( ) {
User user = new User ( ) ;
user. setUname ( "强哥" ) ;
userMapper. insert ( user) ;
Order order = new Order ( ) ;
order. setMoney ( "100" ) ;
orderMapper. insert ( order) ;
}
四.ShardingSphere-JDBC水平分片
4.1 数据库
注意:
水平分片的id需要在业务层实现,不能依赖数据库的主键自增
4.2 基本配置
#== == == == == == == == == == == == 基本配置
# 应用名称
spring. application. name= sharging- jdbc- demo
# 开发环境设置
spring. profiles. active= dev
# 内存模式
spring. shardingsphere. mode. type= Memory
# 打印SQl
spring. shardingsphere. props. sql- show= true
#== == == == == == == == == == == == 数据源配置
# 配置真实数据源
spring. shardingsphere. datasource. names= server- user, server- order0, server- order1
# 配置第 1 个数据源
spring. shardingsphere. datasource. server- order0. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. server- order0. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. server- order0. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3306 / gu? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. server- order0. username= root
spring. shardingsphere. datasource. server- order0. password= root
# 配置第 2 个数据源
spring. shardingsphere. datasource. server- order1. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. server- order1. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. server- order1. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3307 / test? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. server- order1. username= root
spring. shardingsphere. datasource. server- order1. password= root
# 配置第 3 个数据源
spring. shardingsphere. datasource. server- user. type= com. zaxxer. hikari. HikariDataSource
spring. shardingsphere. datasource. server- user. driver- class - name= com. mysql. jdbc. Driver
spring. shardingsphere. datasource. server- user. jdbc- url= jdbc: mysql: / / 192.168 .1 .110 : 3308 / test? useUnicode= true & characterEncoding= utf8
spring. shardingsphere. datasource. server- user. username= root
spring. shardingsphere. datasource. server- user. password= root
4.3 标椎分片表配置
#== == == == == == == == == == == == 标准分片表配置(数据节点配置)
# spring. shardingsphere. rules. sharding. tables. -name> . actual- data- nodes= 值
# 值由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
# < table- name> :逻辑表名
spring. shardingsphere. rules. sharding. tables. t_user. actual- data- nodes= server- user. t_user
spring. shardingsphere. rules. sharding. tables. t_order. actual- data- nodes= server- order1. t_order1
# spring. shardingsphere. rules. sharding. tables. t_order. actual- data- nodes= server- order0. t_order , server- order0. t_order1, server- order1. t_order, server- order1. t_order1
测试:保留上面配置中的一个分片表节点分别进行测试,检查每个分片节点是否可用
@Test
public void testInsertOrder ( ) {
Order order = new Order ( ) ;
order. setMoney ( "11111" ) ;
orderMapper. insert ( order) ;
}
4.4 分片算法配置
#== == == == == == == == == == == == 标准分片表配置(数据节点配置)
# spring. shardingsphere. rules. sharding. tables. -name> . actual- data- nodes= 值
# 值由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
# < table- name> :逻辑表名
spring. shardingsphere. rules. sharding. tables. t_user. actual- data- nodes= server- user. t_user
spring. shardingsphere. rules. sharding. tables. t_order. actual- data- nodes= server- order$-> { 0. .1 } . t_order$-> { 0. .1 }
#-- -- -- -- -- -- -- -- -- -- -- -- 分库策略
# 分片列名称 选择根据哪一列进行分片
spring. shardingsphere. rules. sharding. tables. t_order. database- strategy. standard. sharding- column= user_id
# 分片算法名称 选择哪种算法进行分片
spring. shardingsphere. rules. sharding. tables. t_order. database- strategy. standard. sharding- algorithm- name= alg_mod
#-- -- -- -- -- -- -- -- -- -- -- -- 分片算法配置
# 行表达式分片算法
# 分片算法类型
spring. shardingsphere. rules. sharding. sharding- algorithms. alg_inline_userid. type= INLINE
# 分片算法属性配置 路由到哪个数据源取决于userId
spring. shardingsphere. rules. sharding. sharding- algorithms. alg_inline_userid. props. algorithm- expression= server- order$-> { user_id % 2 }
# 取模分片算法
# 分片算法类型
spring. shardingsphere. rules. sharding. sharding- algorithms. alg_mod. type= MOD
# 分片算法属性配置
spring. shardingsphere. rules. sharding. sharding- algorithms. alg_mod. props. sharding- count= 2
#-- -- -- -- -- -- -- -- -- -- -- -- 分表策略
# 分片列名称
spring. shardingsphere. rules. sharding. tables. t_order. table- strategy. standard. sharding- column= money
# 分片算法名称
spring. shardingsphere. rules. sharding. tables. t_order. table- strategy. standard. sharding- algorithm- name= alg_hash_mod
#-- -- -- -- -- -- -- -- -- -- -- -- 分片算法配置
# 哈希取模分片算法
# 分片算法类型
spring. shardingsphere. rules. sharding. sharding- algorithms. alg_hash_mod. type= HASH_MOD
# 分片算法属性配置
spring. shardingsphere. rules. sharding. sharding- algorithms. alg_hash_mod. props. sharding- count= 2
分库分表测试
@Test
public void testInsertOrderTableStrategy ( ) {
for ( long i = 1 ; i < 5 ; i++ ) {
Order order = new Order ( ) ;
order. setMoney ( "ATGUIGU" + i) ;
order. setUserId ( 1L ) ;
orderMapper. insert ( order) ;
}
for ( long i = 5 ; i < 9 ; i++ ) {
Order order = new Order ( ) ;
order. setMoney ( "ATGUIGU" + i) ;
order. setUserId ( 2L ) ;
orderMapper. insert ( order) ;
}
}
通过userId(2)取余之后,ATGUIGU5~8分配在server-order0的库,然后通过money列取哈希之后分配在不同的表 通过userId(1)取余之后,ATGUIGU5~8分配在server-order0的库,然后通过money列取哈希之后分配在不同的表 查询测试
@Test
public void testShardingSelectByUserId ( ) {
QueryWrapper < Order > orderQueryWrapper = new QueryWrapper < > ( ) ;
orderQueryWrapper. eq ( "user_id" , 1L ) . or ( ) . eq ( "user_id" , 2L ) ;
List < Order > orders = orderMapper. selectList ( orderQueryWrapper) ;
orders. forEach ( System . out:: println ) ;
}
4.5 分布式序列算法
雪花算法: 水平分片需要关注全局序列,因为不能简单的使用基于数据库的主键自增。
这里有两种方案:一种是基于MyBatisPlus的id策略;一种是ShardingSphere-JDBC的全局序列配置。
基于MyBatisPlus的id策略:
将Order类的id设置成如下形式
@TableId ( type = IdType . ASSIGN_ID)
private Long id;
基于ShardingSphere-JDBC的全局序列配置
:
#-- -- -- -- -- -- -- -- -- -- -- -- 分布式序列策略配置
# 分布式序列列名称
spring. shardingsphere. rules. sharding. tables. t_order. key- generate- strategy. column= id
# 分布式序列算法名称
spring. shardingsphere. rules. sharding. tables. t_order. key- generate- strategy. key- generator- name= alg_snowflake
# 分布式序列算法配置
# 分布式序列算法类型
spring. shardingsphere. rules. sharding. key- generators. alg_snowflake. type= SNOWFLAKE
# 分布式序列算法属性配置
#spring. shardingsphere. rules. sharding. key- generators. alg_snowflake. props. xxx=
此时,需要将实体类中的id策略修改成以下形式:
@TableId ( type = IdType . AUTO)
4.6 多表关联
创建关联表
在server-order0、server-order1
服务器中分别创建两张订单详情表t_order_item0、t_order_item1
我们希望同一个用户的订单表和订单详情表中的数据都在同一个数据源中,避免跨库关联
,因此这两张表我们使用相同的分片策略。
那么在t_order_item
中我们也需要创建order_no
和user_id
这两个分片键
CREATE TABLE t_order_item0 (
id BIGINT,
order_no VARCHAR ( 30 ) ,
user_id BIGINT,
price DECIMAL ( 10 , 2 ) ,
`count` INT,
PRIMARY KEY ( id)
) ;
CREATE TABLE t_order_item1 (
id BIGINT,
order_no VARCHAR ( 30 ) ,
user_id BIGINT,
price DECIMAL ( 10 , 2 ) ,
`count` INT,
PRIMARY KEY ( id)
) ;
你可能感兴趣的:(技术学习,数据库,中间件,java)
Long类型前后端数据不一致
igotyback
前端
响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问
LocalDateTime 转 String
igotyback
java 开发语言
importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassMain{publicstaticvoidmain(String[]args){//获取当前时间LocalDateTimenow=LocalDateTime.now();//定义日期格式化器DateTimeFormatterformat
Linux下QT开发的动态库界面弹出操作(SDL2)
13jjyao
QT类 qt 开发语言 sdl2 linux
需求:操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序难点:调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的思路:1.调用方缺QApplication::exec(),那么我们在接口
消息中间件有哪些常见类型
xmh-sxh-1314
java
消息中间件根据其设计理念和用途,可以大致分为以下几种常见类型:点对点消息队列(Point-to-PointMessagingQueues):在这种模型中,消息被发送到特定的队列中,消费者从队列中取出并处理消息。队列中的消息只能被一个消费者消费,消费后即被删除。常见的实现包括IBM的MQSeries、RabbitMQ的部分使用场景等。适用于任务分发、负载均衡等场景。发布/订阅消息模型(Pub/Sub
Google earth studio 简介
陟彼高冈yu
旅游
GoogleEarthStudio是一个基于Web的动画工具,专为创作使用GoogleEarth数据的动画和视频而设计。它利用了GoogleEarth强大的三维地图和卫星影像数据库,使用户能够轻松地创建逼真的地球动画、航拍视频和动态地图可视化。网址为https://www.google.com/earth/studio/。GoogleEarthStudio是一个基于Web的动画工具,专为创作使用G
关于提高复杂业务逻辑代码可读性的思考
编程经验分享
开发经验 java 数据库 开发语言
目录前言需求场景常规写法拆分方法领域对象总结前言实际工作中大部分时间都是在写业务逻辑,一般都是三层架构,表示层(Controller)接收客户端请求,并对入参做检验,业务逻辑层(Service)负责处理业务逻辑,一般开发都是在这一层中写具体的业务逻辑。数据访问层(Dao)是直接和数据库交互的,用于查数据给业务逻辑层,或者是将业务逻辑层处理后的数据写入数据库。简单的增删改查接口不用多说,基本上写好一
SQL Server_查询某一数据库中的所有表的内容
qq_42772833
SQL Server 数据库 sqlserver
1.查看所有表的表名要列出CrabFarmDB数据库中的所有表(名),可以使用以下SQL语句:USECrabFarmDB;--切换到目标数据库GOSELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_TYPE='BASETABLE';对这段SQL脚本的解释:SELECTTABLE_NAME:这个语句的作用是从查询结果中选择TABLE_NAM
DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理
STU学生网页设计
网页设计 期末网页作业 html静态网页 html5期末大作业 网页设计 web大作业
️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程
【华为OD机试真题2023B卷 JAVA&JS】We Are A Team
若博豆
java 算法 华为 javascript
华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代
深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具
nseejrukjhad
数据库 python
深入理解MultiQueryRetriever:提升向量数据库检索效果的强大工具引言在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。MultiQueryRetriever的工
关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript
二挡起步
web前端期末大作业 javascript html css 旅游 风景
⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip
HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动
二挡起步
web前端期末大作业 web设计网页规划与设计 html css javascript dreamweaver 前端
Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线
MongoDB Oplog 窗口
喝醉酒的小白
MongoDB 运维
在MongoDB中,oplog(操作日志)是一个特殊的日志系统,用于记录对数据库的所有写操作。oplog允许副本集成员(通常是从节点)应用主节点上已经执行的操作,从而保持数据的一致性。它是MongoDB副本集实现数据复制的基础。MongoDBOplog窗口oplog窗口是指在MongoDB副本集中,从节点可以用来同步数据的时间范围。这个窗口通常由以下因素决定:Oplog大小:oplog的大小是有限
node.js学习
小猿L
node.js node.js 学习 vim
node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行
python os 环境变量
CV矿工
python 开发语言 numpy
环境变量:环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。os.environ是一个环境变量的字典。环境变量的相关操作importos"""设置/修改环境变量:os.environ[‘环境变量名称’]=‘环境变量值’#其中key和value均为string类
【PG】常见数据库、表属性设置
江无羡
数据库
PG的常见属性配置方法数据库复制、备份相关表的复制标识单表操作批量表操作链接数据库复制、备份相关表的复制标识单表操作通过ALTER语句单独更改一张表的复制标识。ALTERTABLE[tablename]REPLICAIDENTITYFULL;批量表操作通过代码块的方式,对某个schema中的所有表一起更新其复制标识。SELECTtablename,CASErelreplidentWHEN'd'TH
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
insert into select 主键自增_mybatis拦截器实现主键自动生成
weixin_39521651
insert into select 主键自增 mybatis delete返回值 mybatis insert返回主键 mybatis insert返回对象 mybatis plus insert返回主键 mybatis plus 插入生成id
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把mybatis切换成mybatis-plus。mybat
【六】阿伟开始搭建Kafka学习环境
能源恒观
中间件 学习 kafka spring
阿伟开始搭建Kafka学习环境概述上一篇文章阿伟学习了Kafka的核心概念,并且把市面上流行的消息中间件特性进行了梳理和对比,方便大家在学习过程中进行对比学习,最后梳理了一些Kafka使用中经常遇到的Kafka难题以及解决思路,经过上一篇的学习我相信大家对Kafka有了初步的认识,本篇将继续学习Kafka。一、安装和配置学习一项技术首先要搭建一套服务,而Kafka的运行主要需要部署jdk、zook
Java 重写(Override)与重载(Overload)
叨唧唧的
Java重写(Override)与重载(Overload)重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如:父类的一个方法申明了一个检查异常IOExceptio
简单了解 JVM
记得开心一点啊
jvm
目录♫什么是JVM♫JVM的运行流程♫JVM运行时数据区♪虚拟机栈♪本地方法栈♪堆♪程序计数器♪方法区/元数据区♫类加载的过程♫双亲委派模型♫垃圾回收机制♫什么是JVMJVM是JavaVirtualMachine的简称,意为Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统(如:JVM、VMwave、VirtualBox)。JVM和其他两个虚拟机
关于Mysql 中 Row size too large (> 8126) 错误的解决和理解
秋刀prince
mysql mysql 数据库
提示:啰嗦一嘴,数据库的任何操作和验证前,一定要记得先备份!!!不会有错;文章目录问题发现一、问题导致的可能原因1、页大小2、行格式2.1compact格式2.2Redundant格式2.3Dynamic格式2.4Compressed格式3、BLOB和TEXT列二、解决办法1、修改页大小(不推荐)2、修改行格式3、修改数据类型为BLOB和TEXT列4、其他优化方式(可以参考使用)4.1合理设置数据
1分钟解决 -bash: mvn: command not found,在Centos 7中安装Maven
Energet!c
开发语言
1分钟解决-bash:mvn:commandnotfound,在Centos7中安装Maven检查Java环境1下载Maven2解压Maven3配置环境变量4验证安装5常见问题与注意事项6总结检查Java环境Maven依赖Java环境,请确保系统已经安装了Java并配置了环境变量。可以通过以下命令检查:java-version如果未安装,请先安装Java。1下载Maven从官网下载:前往Apach
Java企业面试题3
马龙强_
java
1.break和continue的作用(智*图)break:用于完全退出一个循环(如for,while)或一个switch语句。当在循环体内遇到break语句时,程序会立即跳出当前循环体,继续执行循环之后的代码。continue:用于跳过当前循环体中剩余的部分,并开始下一次循环。如果是在for循环中使用continue,则会直接进行条件判断以决定是否执行下一轮循环。2.if分支语句和switch分
JVM、JRE和 JDK:理解Java开发的三大核心组件
Y雨何时停T
Java java
Java是一门跨平台的编程语言,它的成功离不开背后强大的运行环境与开发工具的支持。在Java的生态中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个至关重要的核心组件。本文将探讨JVM、JDK和JRE的区别,帮助你更好地理解Java的运行机制。1.JVM:Java虚拟机(JavaVirtualMachine)什么是JVM?JVM,即Java虚拟机,是Ja
Java面试题精选:消息队列(二)
芒果不是芒
Java面试题精选 java kafka
一、Kafka的特性1.消息持久化:消息存储在磁盘,所以消息不会丢失2.高吞吐量:可以轻松实现单机百万级别的并发3.扩展性:扩展性强,还是动态扩展4.多客户端支持:支持多种语言(Java、C、C++、GO、)5.KafkaStreams(一个天生的流处理):在双十一或者销售大屏就会用到这种流处理。使用KafkaStreams可以快速的把销售额统计出来6.安全机制:Kafka进行生产或者消费的时候会
白骑士的Java教学基础篇 2.5 控制流语句
白骑士所长
Java 教学 java 开发语言
欢迎继续学习Java编程的基础篇!在前面的章节中,我们了解了Java的变量、数据类型和运算符。接下来,我们将探讨Java中的控制流语句。控制流语句用于控制程序的执行顺序,使我们能够根据特定条件执行不同的代码块,或重复执行某段代码。这是编写复杂程序的基础。通过学习这一节内容,你将掌握如何使用条件语句和循环语句来编写更加灵活和高效的代码。条件语句条件语句用于根据条件的真假来执行不同的代码块。if语句‘
python语法——三目运算符
HappyRocking
python python 三目运算符
在java中,有三目运算符,如:intc=(a>b)?a:b表示c取两者中的较大值。但是在python,不能直接这样使用,估计是因为冒号在python有分行的关键作用。那么在python中,如何实现类似功能呢?可以使用ifelse语句,也是一行可以完成,格式为:aifbelsec表示如果b为True,则表达式等于a,否则等于c。如:c=(aif(a>b)elseb)同样是完成了取最大值的功能。
ArrayList 源码解析
程序猿进阶
Java基础 ArrayList List java 面试 性能优化 架构设计 idea
ArrayList是Java集合框架中的一个动态数组实现,提供了可变大小的数组功能。它继承自AbstractList并实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量capacity,表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添
Java爬虫框架(一)--架构设计
狼图腾-狼之传说
java 框架 java 任务 html解析器 存储 电子商务
一、架构图那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容数据库:存储商品信息索引:商品的全文搜索索引Task队列:需要爬取的网页列表Visited表:已经爬取过的网页列表爬虫监控平台:web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。二、爬虫1.流程1)Scheduler启动爬虫器,TaskMast
矩阵求逆(JAVA)利用伴随矩阵
qiuwanchi
利用伴随矩阵求逆矩阵
package gaodai.matrix;
import gaodai.determinant.DeterminantCalculation;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 矩阵求逆(利用伴随矩阵)
* @author 邱万迟
单例(Singleton)模式
aoyouzi
单例 模式 Singleton
3.1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式。这种情况在我们应用中经常碰到,例如缓存池,数据库连接池,线程池,一些应用服务实例等。在多线程环境中,为了保证实例的唯一性其实并不简单,这章将和读者一起探讨如何实现单例模式。 3.2
[开源与自主研发]就算可以轻易获得外部技术支持,自己也必须研发
comsci
开源
现在国内有大量的信息技术产品,都是通过盗版,免费下载,开源,附送等方式从国外的开发者那里获得的。。。。。。
虽然这种情况带来了国内信息产业的短暂繁荣,也促进了电子商务和互联网产业的快速发展,但是实际上,我们应该清醒的看到,这些产业的核心力量是被国外的
页面有两个frame,怎样点击一个的链接改变另一个的内容
Array_06
UI XHTML
<a src="地址" targets="这里写你要操作的Frame的名字" />搜索
然后你点击连接以后你的新页面就会显示在你设置的Frame名字的框那里
targerts="",就是你要填写目标的显示页面位置
=====================
例如:
<frame src=&
Struts2实现单个/多个文件上传和下载
oloz
文件上传 struts
struts2单文件上传:
步骤01:jsp页面
<!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data,不然就会以二进制文本上传到服务器端-->
<form action="fileUplo
推荐10个在线logo设计网站
362217990
logo
在线设计Logo网站。
1、http://flickr.nosv.org(这个太简单)
2、http://www.logomaker.com/?source=1.5770.1
3、http://www.simwebsol.com/ImageTool
4、http://www.logogenerator.com/logo.php?nal=1&tpl_catlist[]=2
5、ht
jsp上传文件
香水浓
jsp fileupload
1. jsp上传
Notice:
1. form表单 method 属性必须设置为 POST 方法 ,不能使用 GET 方法
2. form表单 enctype 属性需要设置为 multipart/form-data
3. form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址或者servlet地址。例如 uploadFile.jsp 程序文件用来处理上传的文
我的架构经验系列文章 - 前端架构
agevs
JavaScript Web 框架 UI jQuer
框架层面:近几年前端发展很快,前端之所以叫前端因为前端是已经可以独立成为一种职业了,js也不再是十年前的玩具了,以前富客户端RIA的应用可能会用flash/flex或是silverlight,现在可以使用js来完成大部分的功能,因此js作为一门前端的支撑语言也不仅仅是进行的简单的编码,越来越多框架性的东西出现了。越来越多的开发模式转变为后端只是吐json的数据源,而前端做所有UI的事情。MVCMV
android ksoap2 中把XML(DataSet) 当做参数传递
aijuans
android
我的android app中需要发送webservice ,于是我使用了 ksop2 进行发送,在测试过程中不是很顺利,不能正常工作.我的web service 请求格式如下
[html]
view plain
copy
<Envelope xmlns="http://schemas.
使用Spring进行统一日志管理 + 统一异常管理
baalwolf
spring
统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影!
统一日志异常实现类:
[java]
view plain
copy
package com.pilelot.web.util;
impor
Android SDK 国内镜像
BigBird2012
android sdk
一、镜像地址:
1、东软信息学院的 Android SDK 镜像,比配置代理下载快多了。
配置地址, http://mirrors.neusoft.edu.cn/configurations.we#android
2、北京化工大学的:
IPV4:ubuntu.buct.edu.cn
IPV4:ubuntu.buct.cn
IPV6:ubuntu.buct6.edu.cn
HTML无害化和Sanitize模块
bijian1013
JavaScript AngularJS Linky Sanitize
一.ng-bind-html、ng-bind-html-unsafe
AngularJS非常注重安全方面的问题,它会尽一切可能把大多数攻击手段最小化。其中一个攻击手段是向你的web页面里注入不安全的HTML,然后利用它触发跨站攻击或者注入攻击。
考虑这样一个例子,假设我们有一个变量存
[Maven学习笔记二]Maven命令
bit1129
maven
mvn compile
compile编译命令将src/main/java和src/main/resources中的代码和配置文件编译到target/classes中,不会对src/test/java中的测试类进行编译
MVN编译使用
maven-resources-plugin:2.6:resources
maven-compiler-plugin:2.5.1:compile
&nbs
【Java命令二】jhat
bit1129
Java命令
jhat用于分析使用jmap dump的文件,,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。 jhat默认开启监听端口7000的HTTP服务,jhat是Java Heap Analysis Tool的缩写
1. 用法:
[hadoop@hadoop bin]$ jhat -help
Usage: jhat [-stack <bool&g
JBoss 5.1.0 GA:Error installing to Instantiated: name=AttachmentStore state=Desc
ronin47
进到类似目录 server/default/conf/bootstrap,打开文件 profile.xml找到: Xml代码<bean
name="AttachmentStore"
class="org.jboss.system.server.profileservice.repository.AbstractAtta
写给初学者的6条网页设计安全配色指南
brotherlamp
UI ui自学 ui视频 ui教程 ui资料
网页设计中最基本的原则之一是,不管你花多长时间创造一个华丽的设计,其最终的角色都是这场秀中真正的明星——内容的衬托
我仍然清楚地记得我最早的一次美术课,那时我还是一个小小的、对凡事都充满渴望的孩子,我摆放出一大堆漂亮的彩色颜料。我仍然记得当我第一次看到原色与另一种颜色混合变成第二种颜色时的那种兴奋,并且我想,既然两种颜色能创造出一种全新的美丽色彩,那所有颜色
有一个数组,每次从中间随机取一个,然后放回去,当所有的元素都被取过,返回总共的取的次数。写一个函数实现。复杂度是什么。
bylijinnan
java 算法 面试
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
/**
* http://weibo.com/1915548291/z7HtOF4sx
* #面试题#有一个数组,每次从中间随机取一个,然后放回去,当所有的元素都被取过,返回总共的取的次数。
* 写一个函数实现。复杂度是什么
struts2获得request、session、application方式
chiangfai
application
1、与Servlet API解耦的访问方式。
a.Struts2对HttpServletRequest、HttpSession、ServletContext进行了封装,构造了三个Map对象来替代这三种对象要获取这三个Map对象,使用ActionContext类。
----->
package pro.action;
import java.util.Map;
imp
改变python的默认语言设置
chenchao051
python
import sys
sys.getdefaultencoding()
可以测试出默认语言,要改变的话,需要在python lib的site-packages文件夹下新建:
sitecustomize.py, 这个文件比较特殊,会在python启动时来加载,所以就可以在里面写上:
import sys
sys.setdefaultencoding('utf-8')
&n
mysql导入数据load data infile用法
daizj
mysql 导入数据
我们常常导入数据!mysql有一个高效导入方法,那就是load data infile 下面来看案例说明
基本语法:
load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTI
phpexcel导入excel表到数据库简单入门示例
dcj3sjt126com
PHP Excel
跟导出相对应的,同一个数据表,也是将phpexcel类放在class目录下,将Excel表格中的内容读取出来放到数据库中
<?php
error_reporting(E_ALL);
set_time_limit(0);
?>
<html>
<head>
<meta http-equiv="Content-Type"
22岁到72岁的男人对女人的要求
dcj3sjt126com
22岁男人对女人的要求是:一,美丽,二,性感,三,有份具品味的职业,四,极有耐性,善解人意,五,该聪明的时候聪明,六,作小鸟依人状时尽量自然,七,怎样穿都好看,八,懂得适当地撒娇,九,虽作惊喜反应,但看起来自然,十,上了床就是个无条件荡妇。 32岁的男人对女人的要求,略作修定,是:一,入得厨房,进得睡房,二,不必服侍皇太后,三,不介意浪漫蜡烛配盒饭,四,听多过说,五,不再傻笑,六,懂得独
Spring和HIbernate对DDM设计的支持
e200702084
DAO 设计模式 spring Hibernate 领域模型
A:数据访问对象
DAO和资源库在领域驱动设计中都很重要。DAO是关系型数据库和应用之间的契约。它封装了Web应用中的数据库CRUD操作细节。另一方面,资源库是一个独立的抽象,它与DAO进行交互,并提供到领域模型的“业务接口”。
资源库使用领域的通用语言,处理所有必要的DAO,并使用领域理解的语言提供对领域模型的数据访问服务。
NoSql 数据库的特性比较
geeksun
NoSQL
Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前由VMware主持开发工作。
1. 数据模型
作为Key-value型数据库,Redis也提供了键(Key)和值(Value)的映射关系。除了常规的数值或字符串,Redis的键值还可以是以下形式之一:
Lists (列表)
Sets
使用 Nginx Upload Module 实现上传文件功能
hongtoushizi
nginx
转载自: http://www.tuicool.com/wx/aUrAzm
普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦。Nginx有一个Upload模块,可以非常简单的实现文件上传功能。此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面。下
spring-boot-web-ui及thymeleaf基本使用
jishiweili
spring thymeleaf
视图控制层代码demo如下:
@Controller
@RequestMapping("/")
public class MessageController {
private final MessageRepository messageRepository;
@Autowired
public MessageController(Mes
数据源架构模式之活动记录
home198979
PHP 架构 活动记录 数据映射
hello!架构
一、概念
活动记录(Active Record):一个对象,它包装数据库表或视图中某一行,封装数据库访问,并在这些数据上增加了领域逻辑。
对象既有数据又有行为。活动记录使用直截了当的方法,把数据访问逻辑置于领域对象中。
二、实现简单活动记录
活动记录在php许多框架中都有应用,如cakephp。
<?php
/**
* 行数据入口类
*
Linux Shell脚本之自动修改IP
pda158
linux centos Debian 脚本
作为一名
Linux SA,日常运维中很多地方都会用到脚本,而服务器的ip一般采用静态ip或者MAC绑定,当然后者比较操作起来相对繁琐,而前者我们可以设置主机名、ip信息、网关等配置。修改成特定的主机名在维护和管理方面也比较方便。如下脚本用途为:修改ip和主机名等相关信息,可以根据实际需求修改,举一反三!
#!/bin/sh
#auto Change ip netmask ga
开发环境搭建
独浮云
eclipse jdk tomcat
最近在开发过程中,经常出现MyEclipse内存溢出等错误,需要重启的情况,好麻烦。对于一般的JAVA+TOMCAT项目开发,其实没有必要使用重量级的MyEclipse,使用eclipse就足够了。尤其是开发机器硬件配置一般的人。
&n
操作日期和时间的工具类
vipbooks
工具类
大家好啊,好久没有来这里发文章了,今天来逛逛,分享一篇刚写不久的操作日期和时间的工具类,希望对大家有所帮助。
/*
* @(#)DataFormatUtils.java 2010-10-10
*
* Copyright 2010 BianJing,All rights reserved.
*/
package test;
impor