- 博客(58)
- 资源 (14)
- 问答 (1)
- 收藏
- 关注
原创 MySQL SQL优化
索引优化原则1、组合索引中,如果索引字段的用到了范围查询,那么之后的字段就无法使用索引。例如:有组合索引(a1,a2,a3)在表table1上,那么SQL语句 select * from table1 where a1 = 1 and a2 > 1 and a3 = 3;那么a3字段无法走索引。2、关联查询的关联字段的索引建立原则,左连接右表建索引,右连接左表建索引。3、索引用在经常使用的字段上面。4、小表驱动大表。5、优先优化内层循环。6、JoinBuffer可以适当调大。索引失效
2022-01-29 20:48:59
1946
1
原创 MySQL 锁
锁介绍复习:事务和ACID特性并发事务问题:更新丢失、脏读、不可重复读、幻读隔离级别MySQL默认的隔离级别:可重复读在MySQL中锁是由存储引擎实现的。行锁共享锁(shared locks)和排他锁(exclusive locks)在InnoDB存储引擎中默认使用的就是行锁,分为共享锁和排它锁。共享锁:容许事务加锁去读取某一行数据。排它锁:容许事务持有锁去更新和删除某一行数据。意向锁 (intention locks)innodb支持多种粒度的锁,这种锁可以允许行锁和表
2022-01-29 20:30:40
737
原创 MySQL explain讲解
用法explain <查询SQL>索引用途:排序和查询;id列id相同,执行顺序由上到下。id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。id相同和不同的会同时存在。select_type列simple: 检查的select查询,查询中不包含子查询或者unionprimary: 查询中若包含任何复杂的子部分,最外层被标记为primary,一般最后执行的。subquery: 在select或where列表中包含了子查询derived:在fro
2022-01-26 00:34:17
1009
原创 Raft算法
Raft算法一致性算法,主要解决选举问题(leader election)和副本同步问题(log replication)强烈推荐看这个动画学习该算法http://thesecretlivesofdata.com/raft/
2022-01-23 22:52:59
168
原创 Java开发之实时计算--Flink
简介介绍计算框架对java开发的重要性介绍flink的架构介绍flink的基本概念:常用算子、checkpoint、state、window介绍flink的编程模型:DataStream、DataSet、Table API、SQL介绍flink的部署计算框架每个Java开发一定要懂至少一个流行的计算框架,因为现在的数据量越来越大,光靠数据库或者手写代码去实现难度已经越来越大,不仅涉及到资源调度,还要考虑分布式,并且还要考虑高可用、容错等等,因此我们需要借助现有的分布式计算框架来实现我们大规
2022-01-23 14:10:43
10006
2
原创 Java开发之消息队列
简介介绍消息队列的重要性介绍Java程序员常用的Kafka消息队列介绍Kafka内部的一些机制及注意问题为什么要使用消息队列?比较常见的作用有3点,解耦、异步处理、流量削峰,这里分别一一介绍这些特点。解耦我们在设计微服务的时候经常会出现几个模块之间需要相互依赖,例如A和B服务相互依赖,那么部署一个A,必须部署一个B,导致A模块和B模块之间形成了强耦合。如果此时我们在A和B模块之间引入消息队列,那么A可以不用依赖B,只需要A和B之间规定通用的消息格式即可,这样A和B就解耦了,这样以后别的模块
2022-01-18 22:44:17
8686
原创 Java开发之常见缓存系统
前言主要介绍在java项目开发中,如何设计缓存系统,以及需要注意的一些问题。常见框架中的缓存方式Web缓存数据库缓存Redis缓存为什么需要缓存?可以说,缓存的设计在整个IT行业无处不在,不论是硬件还是软件。从CPU寄存器、CPU L1/L2/L3级缓存,再到我们用的内存,以及硬盘里面的缓存,都是缓存系统的考虑。他们解决问题的目的只有一个:CPU速度太快,而磁盘速度太慢;CPU负责计算,磁盘负责存储。因此,CPU和磁盘不可避免的必须时时刻刻交换数据,如果每次都从磁盘获取数据,效率太低,因此
2022-01-16 17:43:15
1109
原创 Flink Yarn的2种任务提交方式
Flink Yarn的2种任务提交方式Pre-Job模式介绍每次使用flink run运行任务的时候,Yarn都会重新申请Flink集群资源(JobManager和TaskManager),任务执行完成之后,所申请的Flink集群资源就会释放,所申请的Yarn资源是独享的,不与其他任务分享资源。运行命令./bin/flink run -m yarn-cluster -yn 3 -ys 12 -p 4 -yjm 1024m -ytm 4096m ./examples/batch/WordCount.
2021-10-24 16:23:09
4040
原创 Feign全局配置和局部配置
Feign全局配置和局部配置在使用Feign的时候需要注意是否为全局配置和局部配置,否则可能会导致各种奇怪异常,而且在调试的是否也不容易看出问题。全局配置和局部配置的差别比较微妙,稍不注意可能会出问题。因此,这里总结给大家,防止大家也出现异常的问题。全局配置:@Configurationpublic class FeignConfiguration { @Bean public FeignBasicAuthRequestInterceptor basicAuthRequestInt
2021-10-02 13:05:53
5467
2
原创 Feign 400错误引发的一系列问题
Feign 400错误引发的一系列问题问题介绍在使用Feign进行远程调用的时候出现非常奇怪的400错误,错误信息大概如下:feign.FeignException: status 400 reading并且还带有2个非常奇怪的问题:一个前端请求接口,到达后端的时候会发起2次相同的Feign远程调用,但第一次成功,但是第二次会失败,错误信息如上。一个前端请求接口,达到后端的时候调用Feign接口的时候会卡死。问题定位通过开启debug模式,查看输出日志发现,2个Feign接口都调用成功了
2021-10-02 12:22:54
1566
原创 Oracle实时数据抽取项目问题总结
Oracle实时数据抽取项目问题总结项目背景介绍项目主要是将Oracle、MySQL、SQLServer、Db2等其他数据库的实时变更数据同步到其他异构数据库中。本篇文章主要是讨论oracle的实时采集,通过Logminer捕获归档日志,然后将提取后的数据推送到Kafka中。项目使用的技术框架使用的核心框架:https://github.com/debezium/debezium 用于捕获归档日志,然后推送到kafka中。Debezium框架是基于Kafka Connect实现的,分为sour
2021-09-11 11:24:03
1210
原创 线程上下文类加载器在项目中的应用
项目背景支持多种数据源、多种版本的数据库元信息(表信息、字段信息等)同步功能。为了加快同步效率,用到了线程池以此来加快同步效率。面临的问题因为有不同版本、不同数据库的驱动jar,因此不可能将所有的驱动jar都放在一起,因此使用了动态加载jar的方式来隔离不同的驱动jar。初版设计首先设计了所有数据源共同使用的接口,放在web模块,接口如下:public interface GetDBMetaDao { List<TableInfo> getAllTable(String
2021-08-07 12:12:01
317
原创 System.currentTimeMillis()和System.nanoTime()的区别
System.currentTimeMillis()返回的是1970 年 1 月 1 日午夜到目前的毫秒数,建议主要用于获取时间,而不要用于计时,因为在计时的过程中,时间可能受NTP(时间服务器)的影响产生计时误差。System.nanoTime()返回的是一个会不断自增的、精确计时的纳秒数,不受NTP的影响,因此不能用于获取时间,但是非常适合用于精确的计时场景。总结1、System.currentTimeMillis()适合获取时间的场景;2、System.nanoTime()适合计时的场景;
2021-07-17 09:33:44
947
原创 Java性能优化建议
大多数开发人员认为性能优化是个比较复杂的问题,需要大量的经验和知识。是的,这并不没有错。诚然,优化应用程序以获得最好的性能并不是一件容易的事情,但这并不意味着你在没有获得这些经验和知识之前就不能做任何事。下面有几个很容易遵循的建议和最佳实践能够帮你创建一个性能良好的应用程序。这些建议中的大多数都是基于Java的,但是也不一定,也有一些是可以应用于所有的应用程序和编程语言的。在我们分享基于Jav...
2019-03-24 22:22:49
250
原创 事务概述
在与数据库打交道的过程中,事务是一个必须掌握的技能之一。在一般的小项目中由于并发有限,很难看出事务的问题,但是在大型项目中,在高并发的条件下,如果处理不好事务问题,会出现许多很难察觉到的问题,并且也很难清楚的找到问题的根源。处理不好事务会导致许多数据问题,数据可是一家公司重要的财富,因此事务是一个高级程序员必须,也是一定要掌握的技能。ACID特性首先需要了解事务的四大特性(ACID):...
2018-03-25 14:36:48
304
原创 Java程序猿学Python之Import语句
Import语句可以说在Python中是无处不在,非常类似于Java中的import的语句,但是又比Java的强大很多,也复杂的多。首先本文章会讲解import语句的作用,然后讲解一下import语句的内部执行原理以及import语句是按什么样的顺序寻找文件;再者讲解from语句与import语句的使用,动态加载,包导入(又分为相对导入和绝对导入),命名空间包等与import相关的话题。本文章...
2018-03-25 12:33:37
3019
转载 ArrayList循环遍历并删除元素的陷阱
在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。不妨把这个问题当做一道面试题目,我想一定能难道不少的人。今天就给大家说一下在ArrayList循环遍历并删除元素的问题。首先请看下面的例子:import java.util.Arra...
2018-03-15 09:10:25
454
原创 LockSupport的park和unpark操作
以前见到过很多次这个类—java.util.concurrent.locks.LockSupport,然而却没有当一回事。一次偶然的机会看到dump文件中很多park操作,这才仔细的研究了一番。LockSupport类似于信号量中的二元信号,主要有如下2个方法: public static void unpark(Thread thread) 释放thread线程的许可证 pub...
2018-03-13 18:20:32
3688
1
原创 Dump文件分析
本文主要介绍Dump文件结构,理解Dump文件对于分析线程高占用、死锁、内存溢出等高级问题有非常重要的指导意义。什么是Dump文件Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。 Dump文件是用来给程序编写人员调试程序用的,这种文件必须用专用工具软件打开。如何生成Dump文件使用命令:jstack pid 可以查看到当前运行的java进程...
2018-03-13 17:34:39
29442
原创 SQLServer的sql_variant数据类型
sql_variant类型的字段在使用中踩过的坑,总结一下:sql_variant类型的字段如果在select语句上直接使用会导致后台抛错,错误信息如下:com.microsoft.sqlserver.jdbc.SQLServerException: The "variant" data type is not supported.因此,在使用sql_variant类型的字段的时候需要...
2018-03-09 15:52:28
8778
原创 TCP建立连接和关闭连接的过程
先来一张图看看整个连接和关闭的过程: 各个状态的意义如下: LISTEN:侦听来自远方TCP端口的连接请求; SYN-SENT:在发送连接请求后等待匹配的连接请求; SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认; ESTABLISHED:代表一个打开的连接,数据可以传送给用户; FIN-WAIT-1:等待远程TCP的连接中断请求,或先前的连接中...
2018-03-07 18:11:56
9864
原创 Java程序猿学Python---集合推导式 Comprehension和生成表达式Generator Expression
集合表达式是Python强大的功能之一,每个Python必须学习基本功。List推导式(List Comprehension)快速创建List集合>>> [x * x for x in range(10)] # List comprehension: builds list[0, 1, 4, 9, 16, 25, 36, 49, 64,...
2018-03-07 16:46:06
525
原创 Java程序猿学Python---mpa、filter、reduce方法
当我们有了java语言的基础,这几个方法简单的瞟一眼就明白了。map方法方法声明:map(func, *iterables) –> map object 方法作用:在iterables参数上应用func指定的方法。 使用例子1:>>>counters = [1, 2, 3, 4]>>>list(map((lambda x: x + 3),...
2018-03-07 15:43:56
392
转载 Redis在游戏开发中的典型应用
1.摘要Redis作为目前最流行的键值对存储数据库,有着丰富的数据结构支持,在民生、金融、游戏、直播等诸多领域都有广泛的应用,大大提升了开发者的开发效率。今天我们主要介绍Redis在游戏开发中的几个典型应用场景:用户数据缓存、持久化功能的消息队列、乐观锁功能。2.典型应用场景下面我们一一来介绍上述几个场景下是如何应用Redis的。2.1 Redis作为DB的缓存通常来说,每...
2018-03-05 10:37:40
1613
原创 Python学习之旅--Lambda表达式在循环语句中需要注意的问题
目前在学习Python中,不时的总结一些学习过程中遇到的一些问题。在循环语句中使用Lambda表达式时需要注意一些潜在的问题,先看代码:>>> def makeActions(): acts = [] for i in range(5): # Tries to remember each i acts.appen...
2018-02-24 18:00:09
4317
1
原创 Scala中的模式匹配match
scala中的模式匹配类似与java中的switch语法,但功能比switch更加强大,且能匹配的方式各种各样。我总结了一下,scala的match的匹配方式有如下几种:通配模式 变量模式 构造器模式 序列模式 元组模式 类型模式
2017-09-01 12:19:40
1181
原创 Spark中宽依赖和窄依赖的区别
Spark中宽依赖和窄依赖窄依赖:RDD的每个分区仅依赖一个父RDD的分区;宽依赖:RDD的每个分区依赖多个父RDD的分区;那么为什么要区分窄依赖和宽依赖呢?窄依赖在划分Stage时,可以划分在一起,而且可以并行计算,并且在数据恢复时只需要重新计算父RDD即可,恢复方便。而宽依赖则不然,因为宽依赖的范围较广,必须重新计算所有的父RDD依赖,计算量大,不容
2017-07-28 18:26:50
1678
1
原创 Redis集群原理分析
Redis集群的原理主要是围绕着‘槽’的概念展开的,先来理解集群中‘槽’的概念。reids集群是通过将所有的key进行分区来实现的,redis集群最多有16384个分区(也可以称作‘槽’,英文:slot),然后在集群节点中指定分区范围来实现。例如:集群中的节点A负责0 - 10000,节点B负责 10001-16384,每个节点负责的分区数可以自行设置。redis中的每一个key都有唯一的分区号与
2017-02-24 16:50:27
508
原创 request中参数(parameter)和属性(Attribute)的区别
在JAVA WEB开发中经常遇到获取请求参数的值和在request对象中set或者get属性,初学者往往容易混淆,那么二者之间关系到底如何呢?下面是个人的总结:区别:来源不同: 参数(parameter)是从客户端(浏览器)中由用户提供的,若是GET方法是从URL中提供的,若是POST方法是从请求体(request body)中提供的; 属性(attribut
2017-02-05 17:36:53
21242
4
原创 Oracle自带全文索引
使用场景:当需要在大量文章中通过关键字搜索文章时,Oracle自带的全文索引对于提高搜索性能非常有帮助,并且使用也很方便。使用前的准备工作:1、先查看oracle是否自带有ctxsys用户,如果没有该用户则不能使用全文索引功能,必须先手动安装,安装方式很简单,参考下一步;2、如果自带有ctxsys用户,请忽略该步骤;(1)dba账号登录SQLPLUS,创建全文索引使
2017-01-21 22:17:17
1025
原创 Java延迟初始化的2种经典模式
静态域的延迟初始化: // Lazy initialization holder class idiom for static fields private static class FieldHolder { static final FieldType field = computeFieldValue(); } static FieldType getField() { r
2016-01-05 23:40:46
1077
原创 私有锁对象模式
// private lock object idiom - thwarts denial-of-service attack private final Object lock = new Object(); public void foo() { synchronized (lock) { ... } }优点:防止其他客户端超时的持有锁对象,从而避免客户端的拒
2016-01-05 23:17:30
1833
原创 Collection.synchronized*方法注意事项
引API的一句话:返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步: List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) {
2016-01-05 22:46:20
1096
JOOQ jar包
2019-04-28
深入理解Linux内核第三版(英文原版)
2019-04-22
数据结构经典教程
2019-04-18
TBase数据库教程
2019-04-18
Neo4j开发手册
2019-04-18
OAuth2实战
2019-04-18
Python机器学习实践指南
2018-02-02
POI官方Jar包
2014-05-29
oracle多字段全文索同步问题
2017-01-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人