- 博客(58)
- 收藏
- 关注
原创 durid多数据源配置不同validation-query
之前在网上也能看到很多关于多数据源的配置方式,但是大多都是同种数据库,针对不同数据库类型的资料较少,最近项目需要一个模块同时连接sqlserver、impala和Oracle,在durid中配置
2021-06-01 09:13:53
7697
原创 关于事件触发的小计
业务场景:1.根据用户操作触发相应的逻辑;2.事件有操作类型,比如说开户、入金、交易满额、拉新等等;3.通过配置相应的活动及活动的奖励,在条件满足条件下发送奖励首先事件的接收肯定是通过MQ,而MQ中必须要有操作的类型code,上下游是统一的。而code就是用户的操作类型,比如说入金。那么就进入入金Handler那么入金在哪些活动中有配置奖励是可以配置、编码确定的。活动也是有类型的,同时可能存在多个同种类型的活动,此时就可以采用取第一个满足条件的活动进行发送奖励。另外活动.
2021-04-22 21:32:34
205
原创 redis和rabbitmq的随笔
1.关于redis分布式锁的一些认识redis做分布式锁是面试中经常问到的问题,而之前参与的项目关于这点,使用的都比较捡漏,最近看了一个项目中的使用,有一些认知,记录下来。set操作保存uuid为什么需要保存一个UUID,并且还需要记录?这是因为在加锁时,一般都是根据用户ID或是其他的ID值,并且这个key还需要追加相应加锁业务前后缀。在线程A获取锁情况下,可能由于业务耗时超过了redis配置的过期时间,而其他的线程B也需要用到这个锁,此时set了值,线程B获取了锁,而之后线程A本意是将他自己的锁释
2021-04-21 22:16:48
309
原创 面试题
1.HashMap在多线程情况下,可能出现问题的环境有哪些?HashMap是数组+单向链表/红黑树的结构,在2处可能出现问题。①在对一个数组位置上为空新增一个节点时,若多线程同时tab[i] = new Node(),则其他线程操作的数据将会丢失。②在扩容阶段,对链表进行扩容时,因是采用node.next()方式获取下个元素,多线程情况下可能出现死循环。2.ConcurrentHashMap是如何解决上面的问题的?①针对数据位置上为空,多线程同时新增的问题,采用CAS(乐观锁)的方式新增元素,若失
2021-03-31 19:50:55
122
原创 redis tips
Redis在4.0版本后针对大键(一个上百万对象的SET),在删除过程中,之前版本因读写单线程,此时删除耗时较多,影响其他线程使用,因此在清除数据时,首先预估耗时,达到阈值后使用lazy free方式,直接将该键数据置位无效,交给异步线程进行清除。因此也是修改了底层的数据结构。redis的回收策略:1、键过期了并不会立刻回收,redis会有定时任务检查过期的数据进行删除,在客户端访问这个过期数据时,也会触发键的删除操作2、当配置的内存满了,redis默认策略是不接受写操作,返回错误信息,接收读操
2021-03-30 20:49:20
109
原创 Go的defer执行逻辑
Go中的defer可以类比java中的finally关键字,在出现异常或是方法执行完成后执行。package mainimport "fmt"func main() { fmt.Println("外层开始") defer func() { fmt.Println("外层准备recover") if err := recover(); err != nil { fmt.Printf("%#v-%#v\n", "外层", err) } else { fmt.Println(
2021-03-12 13:47:13
222
原创 Golang中的零值
Go的零值也就是默认值,与java中不同的是string是基础类型,零值是空字符串,而不是nil有时候在go语言中看到的并不就是原始的状态,go对于nil在fmt输出时会做处理,又是看着是空数组,其实是nil其他可以类比对象的有指针类型、切片(不是数组)、map的零值是nil,但是在fmt直接输出时却不是nil...
2021-03-11 11:16:04
389
原创 oom-killer
发现部署的服务莫名挂掉了,并没有溢出dump文件及错误日志,通过万能搜索引擎帮助,在/var/log/message下查找被谁干掉了。thread1 invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0....Mar 8 10:40:12 localhost kernel: Out of memory: Kill process 17946 (java) score 184 or sacrifice childMar 8
2021-03-09 10:11:00
328
原创 缓存击穿和缓存穿透的区别
关于缓存的常问概念,缓存穿透、缓存击穿的区别点在于:穿透指查询的key在缓存及数据库中并不存在,常指恶意攻击;而缓存击穿是指之前存在key的缓存,单过期了,因此去数据库中查询。穿透 --》 数据库和redis都不存在击穿 --》 redis中的失效了,需要取数据库中查询...
2021-03-09 09:49:57
2971
原创 Hystrix的资源隔离
Hystrix为避免因调用单个服务耗用连接多,造成调用其他服务的不可用情况,提供了线程隔离的功能。有2种模式:1、线程池使用线程池的方式控制访问某个资源的线程数,对于超出此线程池核心线程数的请求,放置在队列中。feign调用过程中,若开启了Hystrix熔断,则feign调用接口将是经过代理的Hystrix类。对于每个feign client都会在服务启动时,创建名称为该应用名的线程池,默认10个核心线程数。2、信号量信号量这个并不是Hystrix特有的,在网关中也存在这个概念。
2021-02-27 15:33:07
178
原创 mysql中rowid的理解
主要记录下mysql中的rowid的理解。MySQL中也是存在rowid的概念,名字叫 _rowid ,是一个非空唯一列的别名,不同情况下指向的不同列,并且存在rowid不存在的情况。存在rowid①当表存在integer类型的单字段主键,_rowid指向的就是当前主键字段②表不存在主键,但是有integer类型的唯一性单字段索引,_rowid指向的就是当前该字段。不存在rowid①表的主键是联合主键,多个主键字段。②表主键是单字段,但是是字符串类型。③表不存在主键,但.
2021-02-27 13:15:45
4194
原创 oracle中的rowid和rownum理解
rownumOracle分页查询相较于mysql来说要繁琐得多,需要配合rownum实现。而为什么需要先获取小于某个值的数据后,再获取大于某个值的结果?是因为rownum是一个逻辑伪列,并不会真实存在,每次生成都是在先生成列表数据后,新增rownum这一列,并且从1开始。那么按照以下方式分页查询第二页数据的SQLselect * from user_info where rownom > 10;在获取结果集后,此时生成伪列ROWNUM,值从1开始,此时不满足大于10的要求,因
2021-02-27 11:14:15
276
原创 spring配置文件加载顺序
首先config中的优先级高于config外resource下的,也就是在environment中的PropertySource元素排在前面。而在springboot项目中,加载application文件,在springcloud项目中,application和bootstrap都可以加载,但是application的优先级更高。...
2021-01-20 23:01:03
851
1
原创 oracle与mysql 区别小记
Oracle相较于MySQL数据库来说,规范更严格,MySQL内涵的隐式转换在Oracle来说是不安全、不允许的。今天主要记录下Oracle和mysql中数值类型的定义区别Oracle中的number(3)和mysql中的int(3)的区别:Oracle中,指定了精度,那么整数位就只能有3位,超出报错而MySQL中并不会报错,从使用上来说int(3)和int(6)没有区别。...
2021-01-18 17:21:15
131
原创 数据库重建索引的一个思路
最近需求涉及到一个保存实时数据的功能,使用Oracle数据库。保存的数据量不大,但是覆盖会比较频繁。造成了一个就几万数据的表,序列可能都达到千万了。这个在Oracle环境下其实还好,但是需要兼容pgsql环境,使用了serial自增序列,最大21亿,因此了解了下关于重置序列的方式。方案一:先drop再create优点:简单缺点:在服务运行过程中执行存在风险方案二:利用负数步长将序列值减小,再恢复步长为1此次使用方案二在程序中定期重置序列存储过程样...
2021-01-18 16:43:03
198
原创 java使用freemarker导出word(xlsx格式,含图表)
使用java程序导出word,此次使用的是模板值替换方式,而导出的word版本是xlsx。直接替换文本和图片,可以直接使用一个word改造的ftl模板,替换启用的参数即可,但是对于图表就比较麻烦。也参照了很多大佬的做法,针对xlsx07版本,主要是将xlsx文件解压,得到很多xml文件,其中文字内容是在document.xml中,如果要替换文本内容,将xml中参数使用freemarker替换即可。如果是图片,则按照图片的先后顺序,保存在word/media/下,以image1.png这个格式开头
2021-01-15 15:39:29
1244
1
原创 MongoDB备份与恢复
# 备份,预先创建保存路径/data/mongo/mongo/backup,dataqulity是需要备份的数据库名称./mongodump -h 192.168.118.128:27017 -d dataqulity -o /data/mongo/mongo/backup#恢复 /data/mongo/mongo/backup/dataqulity/是上一步备份文件存放路径,主要要深入一层./mongorestore -h 192.168.118.128:27017 -d dataqulity -
2020-11-16 15:22:47
185
原创 BigDecimal的equals方法
BigDecimal作为浮点数据的一个处理对象,在平时用的挺多,但是今天才注意到它的equals方法有特殊的地方。equals方法是需要比较数值的精度的。 BigDecimal b_1 = new BigDecimal("1");//精度0 BigDecimal b_2 = new BigDecimal("1.0");//精度1 System.out.println(b_1.equals(b_2));//false BigDeci
2020-09-30 16:55:36
3709
原创 Python中使用with优美的释放资源
Python中有和jdk7中的资源释放语法糖,可以优美的释放资源流程import mysql.connector as connclass DBUtil: def __init__(self, host, user, passwd, database): self.db = conn.connect(host=host, user=user, passwd=passwd, database=database) # with定义完成 def __enter
2020-09-04 17:15:22
703
原创 Python的序列解包
Python的序列解包是一种语法糖,很实用,在函数返回多个值的时候使用尤为方便def test_two_res(): n = 2 m = 3 return n,mn,m = test_two_res()print(n,m) #2 3n,m,*c = "zhangsan"print(n,m,c) #z h ['a', 'n', 'g', 's', 'a', 'n']...
2020-09-04 16:26:27
261
原创 Python批量插入数据
Python批量插入数据到mysql中,相较于jdbc,简化了长度。import mysql.connector as conndef __getConn(): db = conn.connect( host="localhost", user="root", passwd="root", database="test" ) return dbdef insertBatch(db): cur =
2020-09-04 15:41:36
1441
原创 Python中的a, b = b, a + b的理解
a, b = 0, 1a, b = b, a + b可以这么理解:先将等号右边的进行计算,得到的值再赋值所以结果a = 1 b = 1这个与 a = b ; b = a + b的结果是不一样的
2020-08-28 16:54:35
1749
原创 SQL中的WITH AS
在Oracle和TDH中可以使用with as语法,将子查询结果进行抽取,达到提高可读性和复用的效果。mysql中没有这个语法。 WITH A AS (SELECT * FROM USER WHERE AGE > 20), B AS (SELECT * FROM USER_SCORE ) SELECT A.ID,A.NAME,B.SCORE FROM A LEFT JOIN B ON A.UID = B.UID这是一个很简单的用法。但是在TDH环境下需要注意,Oracle没有下面的
2020-08-26 17:10:08
575
原创 Oracle的row_number函数的使用
Oracle提供的row_number()函数可以实现加rownum的作用,并且可以根据字段值的分类,在同类中进行排序SELECT id,NAME,class_id,score,row_number() OVER (PARTITION BY class_id ORDER BY score DESC )FROM STUDENT将学生表中将每个年级的学生成绩进行排名其中PARTITION BY后可以接多个字段进行分类over中还可以只有order by 就实现了rownum的效果...
2020-08-07 15:31:48
1343
原创 Oracle表空间中指定表占用大小
在此记录一个可能不怎么用得到的一个SQL,查询指定Oracle的表在表空间中占用的大小。SELECT segment_name AS TABLENAME, BYTES B, BYTES / 1024 KB, BYTES / 1024 / 1024 MBFROM user_segmentsWHERE segment_name = '表名'...
2020-08-07 14:30:41
205
原创 mybatis中jdbcType的使用
mybatis-plus中注入参数有#{}和${},一般情况下使用预编译的#{}方式,能避免SQL注入问题。在Oracle数据库场景下,mybatis如果参数是null可能出现报错的情况。有2种解决方式:1、在mybatis的xml中在#{}中标记数据类型eg: #{bo.age,jdbcType=DECIMAL}2、在mybatis-plus的配置中做配置mybatis-plus: configuration: jdbc-type-for-null: 'n
2020-08-07 10:43:56
3154
原创 java导出动态表头的CSV文件
CSV相较于xlsx在导出大数据量+字段多的场景下速度更快!本地测试导出30万条数据,CSV比xlsx快20秒+。不过当数据量小或字段少(2个字段)这种情况下使用CSV并没有明显的优势,并且由于CSV存储相同数据占用的磁盘大小比xlsx的大得多(差不多一倍),在网络传输较为频繁的场景也不适合使用CSV。以下为动态导出CSV的功能代码,表头不固定。pom <dependency> <groupId>org.apac
2020-08-05 22:33:47
1683
原创 PostgreSQL查询表主键及注释内容
网上关于pgSql获取表主键的内容都是千篇一律,并且对于存在多主键的场景不支持。附上测试后可获取多个主键字段值的SQLSELECT string_agg(DISTINCT t3.attname,',') AS primaryKeyColumn ,t4.tablename AS tableName , string_agg(cast(obj_description(relfilenode,'pg_class') as varchar),'') as commentFROM pg
2020-07-31 18:19:24
3683
原创 Enhancer的简单实践
需求:对指定类的方法做代理。可以使用Proxy+InvocationHandler实现,但是如果代理类没有父接口的情况下,如何快速实现?spring的cglib下提供的Enhancer可以快速实现对某个类的所有实例方法(除final)进行代理。public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyHandler
2020-07-08 17:10:12
552
原创 增强for循环(foreach)在数组和集合中的不同实现原理
我认为foreach是一种语法糖,简化遍历的代码,实际编译之后是另外实现形式。数组:数组的foreach是通过普通for循环实现的 int[] arr = {1,2,3}; for (int i : arr) { System.out.println(i); } String[] arr2 = {"ss","sa"}; for (String s : arr2) {
2020-07-06 19:13:36
329
原创 xshell修改终端字符编码
在此记录一下关于xshell工具时,针对中文乱码问题的解决方案。例如查看日志,发现有中文乱码,首先查看是否xshell的配置问题。在【文件】-【属性】-【终端】中确认
2020-06-04 09:44:03
10199
原创 一种Oracle数据库分页查询优化思路
在项目中需要对一张表进行分页查询,按照常规的分页写法,使用ROWNUM实现了分页,但是随着数据的不断增加,目前达到300万条,并且有CLOB字段,在查询后几页数据时,直接超时。SELECT L4.ID, L4.EXECUTE_TIME FROM ( SELECT * FROM ( SELECT L2.*,ROWNUM ROW_ID FROM (SELECT * from TABLE1 L ORDER BY L.ID DESC )L2 WHERE ROWNUM <=
2020-05-25 23:01:36
362
原创 MAT分析DUMP文件
如何在jvm启动脚本中添加内存溢出自动dump的内容就不赘述了。今天就只关注dump下来的文件如何进行分析,如何找到是哪一块代码出现了问题。使用的工具是MAT第一步:使用MAT打开dump文件第二部:点击Dominator Tree可以看到内存占用比较高的线程有2个第三部:选中需要查看的线程,查看stack第四部:此时显示的就是发生堆栈溢出时的栈信息,并且有占用大小,就能找到对应的代码位置,未截图的部分就是项目中的代码位置了另外还可以查看集合中的元素值,也是在
2020-05-18 17:56:42
17908
原创 上传jar包到Nexus——页面方式
在此记录通过页面方式将第三方jar包上传到私服的操作经历:因第三方jar没有pom,需要手动将jar上传到公司私服上。步骤:1、登录nexus,然后选择左侧菜单的upload,其他版本的nexus可能是其他方式上传。2、填写信息,需要注意 “Generate a POM file with these coordinates”需要勾上。3、点击upload,然后就可以在项目中使用maven引入了。...
2020-05-12 09:05:55
5222
3
原创 Oracle存储过程中创建表,报权限不足
项目需要在存储过程中首先判断表是否存在,如果不存在,则创建表。按照普通的存储过程编写完成后,执行却报权限不足(幸好本地跑了一遍,免得被测试屌( ̄ェ ̄;))网上的解决思路有2中:1、给当前用户增大权限2、在存储过程中添加权限说明我采用的第二种方式:CREATE OR REPLACE PROCEDURE DATA_UPDATE_SQLauthid current_user...
2020-04-26 21:05:40
2382
原创 Hadoop伪集群搭建实践
环境:CentOS7 1G前期准备:1、4台机器(1master+3slave)虚拟机,为减少放开端口的操作,直接关闭防火墙2、安装java环境,配置环境变量,此处使用JDK83、上传hadoop安装包,此处使用2.7.7版本,解压至/usr/local下下面开始搭建过程:1、修改/usr/local/hadoop-2.7.7/etc/hadoop下的hadoop-env...
2020-04-07 22:38:07
171
原创 leetcode 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]java版解决:获取两数之和为10的下标 public static void...
2020-03-19 11:40:58
94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人