Java随笔
不丸子
一个技术界的小学生,请多多指教
展开
-
分布式⼀致性算法Paxos、Raft、Zab、2CP以及脑裂问题
一、什么是分布式系统定义:分布式系统是支持分布式处理的软件系统,是由通信网络互联的多处理机体系结构上执行任务的系统。简单来说:⼀个业务分拆多个⼦业务,落地成不同的服务,将各个服务部署在不同的容器上。各个服务之间通过某种协议通信交互。而分布式系统的通信,会涉及到交流协作问题。也就会涉及到CAP问题。1、CAP原理CAP定理叫作布鲁尔定理,⼀个分布式系统最多只能同时满⾜⼀致性(Consistency)、可⽤性(Availability)和分区容错性(Partition tolerance)这三项中的两原创 2022-05-11 09:43:02 · 1227 阅读 · 0 评论 -
SpringBoot中的Jackson中日期反序列化问题
在页面中日期格式的参数,放到以字符串方式(yyyy-MM-dd HH:mm:ss)用json格式submit的时候,报错如下:org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize value of type java.util.Date from String "2022-03-17 18:43:02": not a valid represen原创 2022-05-09 07:30:15 · 656 阅读 · 0 评论 -
springboot项目RabbitMq手动开启/关闭监听
前言在springboot项目中使用rabbitmq的@RabbitListener自动开启监听。而如果直接上了生产环境,在升级时候贸然kill掉,可能会损坏业务链条。实为不妥。1、自动启动监听@RabbitListener(queues = "#{queue}",concurrency = "#{concurrency}")public void receiveMsg(SmsMsg message) {}2、手动关闭所有监听当我们想kill掉程序的时候,可以使用kill -15 pid发原创 2022-05-05 13:37:04 · 7621 阅读 · 0 评论 -
写时复制Copy-On-Write
1、什么是写时复制(Copy-On-Write)容器“在并发访问的情景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副本容器)”。2、特点a、应用于读多写少的环境。由于不会修改原始容器,只修改副本容器。因此,可以对原始容器进行并发地读。其次,实现了读操作与写操作的分离,并发读取在原始容器上,而写操作发生在副本上。在写操作时,需要复制一个容器,实际应用场景中,内存开销大小取决于原始容器大小,可原创 2022-05-05 08:41:30 · 974 阅读 · 1 评论 -
分布式ID生成方案
前言但凡开发过分布式系统的程序员,基本都会遇到分布式写入数据ID生成的问题,而传统简单的方式是直接使用mysql的自动增长,或者oracle的序列等。常见的生产方式。1、UUIDJava自带API,生成一串唯一随机36位字符串。能够保证唯一性,但无法有序递增。由于是本地生成,性能比较高,没有网络消耗。2、redis生成唯一主键可以用Redis的原子操作INCR和INCRBY来实现3、SnowFlakeTwitter开源的由64位整数组成分布式ID,性能较高,并且在单机上递增。由于其强依赖机器时原创 2022-04-29 15:20:50 · 677 阅读 · 0 评论 -
springboot使用slf4j
1、引入lombok<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency>2、添加文件名称为logback-spring.xml的配置文件到classpash,内容如下:<?xml version="1.0" encoding="UTF-8"?><configuratio原创 2022-04-26 08:23:30 · 3514 阅读 · 0 评论 -
oracle获取昨天上个月的日期
昨天select to_char(sysdate - 1,'yyyy-MM-dd') from dual;上个月,其中,加上trunc与不加trunc函数的效果一致。select to_char(add_months(trunc(sysdate),-1),'yyyymm') from dual;原创 2022-04-26 07:59:59 · 3824 阅读 · 0 评论 -
mybatis判断integer为空字符串的问题
一、现象当status为Integer类型的时候,传入的值为0时,以下语句无法通过:<if test="status != null && status != ''"> and a.STATUS = #{status}</if>而当传入1的时候,则可以进入到代码块。二、原因与解决mybatis在预编译sql时,使用OGNL表达式来解析if标签,对于Integer类型属性,在判断变量是否等于’‘时:status != ‘’,OGNL会返回’'的长度,(原创 2022-04-22 09:16:00 · 2882 阅读 · 1 评论 -
thymeleaf中[[${}]]与[(${})]的区别
[[…]]中的内容会被转义显示,即:输入的html代码,会原封不动的显示代码。[(…)]不会转移,如果是html代码,则显示了解析后的内容。假设在后台传入msg的值为:我是原始内容前端这样使用:[[msg]]−−−−−−−−[({msg}]]--------[(msg]]−−−−−−−−[({msg})]则最终的效果会是这样我是原始内容--------我是原始内容...原创 2022-04-01 15:03:41 · 924 阅读 · 1 评论 -
一次Java heap space GC overhead limit exceeded分析
1、现象程序跑了一段日子,发现内存突然增高,妥妥的占满了4个G。查看日志,发现有大量的错误:a、Rabbitmq消费错误:o.s.a.r.l.SimpleMessageListenerContainer : Consumer thread error, thread abort.b、redis发序列化错误:org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize原创 2022-02-10 18:10:38 · 1623 阅读 · 0 评论 -
java.lang.NoClassDefFoundError: org/mybatis/generator/api/dom/xml/Element
当在想xml文件上右键运行的时候,提示:打开控制台,到项目根目录。执行如下:mvn -Dmybatis.generator.configurationFile=/z-dao/mybatis-generator/generatorConfig.xml -Dmybatis.generator.overwrite=true mybatis-generator:generate...原创 2022-01-04 07:48:49 · 829 阅读 · 0 评论 -
spring注解注入配置和变量
当spring注解注入配置:可用。如:@RabbitListener(queues="{}。如:@RabbitListener(queues = "。如:@RabbitListener(queues="{data.queue}")当spring注解注入变量:可用#{}。如:@Autowirepublic String str;@RabbitListener(queues = “#{str}”)...原创 2021-11-17 13:24:49 · 1379 阅读 · 0 评论 -
RabbitListener消费数据重复
channel是非线程安全的 。修改后的写法:@RabbitListener(queues = “${data.queue}”,concurrency = “#{data.concurrency}”)public void receiveData(SmsMsg message,@Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {}产生重复的写法:public void receiveData(SmsMsg message,@Header(A原创 2021-11-17 13:18:55 · 562 阅读 · 0 评论 -
mybatis查询oracle时间显示00:00:00
环境mybatis版本:3.3.2oracle版本:11.2现象前端查询显示:原因1、当oracle版本为12c的时候,使用ojdbc8.jar。毫无违和感,不会出现该问题。2、当oracle版本为11.2,使用ojdbc8.jar,ojdbc6.jar,也不会出现该问题。3、当oracle版本为11.2,使用ojbdc14.jar,则出现上图现象。即使在查询时候,通过设置jdbcType="TIMESTAMP"也无法解决。附:java jdbc /ojdbc 连接oracle的几种方原创 2021-09-23 16:55:20 · 462 阅读 · 1 评论 -
2021-08-09
在使用mybatis查询的时候,提示如下错误:Could not set parameters for mapping: ParameterMapping{property=‘PARAM1’, mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId=‘null’, jdbcTypeName=‘null’, expression=‘null’}. Cause: org.apache.iba原创 2021-08-09 13:37:06 · 600 阅读 · 0 评论 -
rabbitmq发送支持优先级的自定义对象
public void sendTopicPriority(String exchange, String routingKey, Object message, Integer priority) { log.info("发送优先级消息!"+priority); rabbitTemplate.setExchange(exchange); rabbitTemplate.setRoutingKey(routingKey); MessageProperties props = new Messa原创 2021-05-19 15:15:33 · 228 阅读 · 0 评论 -
通过jquery提交表单
$("#button").click(function(){$.post(“abc.mvc”, $("#form").serialize(), function(res) {alert(res);});});原创 2021-05-19 08:48:35 · 176 阅读 · 0 评论 -
RedisTemplate实现分布式锁
引用:https://www.cnblogs.com/williamjie/p/9395659.html前言本篇文章引用了以上链接,代码实现由jedis修改成了org.springframework.data.redis.core.RedisTemplate的方式。如喜欢原文,可点击以上链接进入。分布式锁一般有三种实现方式:数据库乐观锁;基于Redis的分布式锁;基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁转载 2021-05-07 09:39:03 · 3732 阅读 · 0 评论 -
sts自动生成hibernate实体和映射文件
1、安装hibernate插件在列表中选择:JBoss Data Services Development等待安装完成后重启sts。2、安装Data Managementhelp ->install new software 界面中,work with:http://download.eclipse.org/releases/kepler根据步骤安装即可。3、创建数据库链接:window->show view->other…右键,new…。选择目标数据库类型创原创 2021-04-19 11:04:23 · 288 阅读 · 0 评论 -
application/x-www-form-urlencoded和application/json的那些事儿
相信搞过B/S的同学应该都会接触到这个问题,即由前端传参到后端,数据的传输问题。当我们在前端提交参数,如何才能在后端,通过者springboot正确的接收全部参数?如何才能通过@RequestBody或者@RequestParam接收传输参数?前端传递json到后端的情景:json的两种情况:传递json字符串。传递json对象。1、json对象类型:Content type:application/x-www-form-urlencoded;charset=UTF-8。当我们点击页面提交。在spri原创 2021-04-19 08:18:01 · 2125 阅读 · 0 评论 -
mybatis插入对象部分属性为空报错
在插入值中,加入jdbcType即可允许空,#{item.memo,jdbcType=VARCHAR}原创 2021-04-13 09:24:22 · 949 阅读 · 0 评论 -
Write operations are not allowed in read-only mode (FlushMode.MANUAL)
在dao层this.getHibernateTemplate().setCheckWriteOperations(false);原创 2021-04-10 20:25:06 · 235 阅读 · 0 评论 -
Property ‘mapperLocations‘ was not specified.
项目启动的时候,控制台输出:Property 'mapperLocations' was not specified.且调用数据库保存实体的时候报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.sh.save经过查询,是没有扫描到xml文件。解决方法很多,本人采用如下方法:在pom.xml 中,标签之间,添加:<resources> <res原创 2021-04-06 16:48:11 · 30494 阅读 · 2 评论 -
springboot启动报错Could not resolve placeholder
项目中使用了@Value注解:@Value("${sms.exchange}")private String exchange;启动时候报错:Could not resolve placeholder原因是配置文件中不存在该配置项。增加sms.exchange对应的配置即可。原创 2021-04-02 15:24:35 · 1091 阅读 · 0 评论 -
java.sql.SQLException: 无效的列类型: 1111
1、值的空的。2、值类型不匹配,在mybatis的xml文件中,增加类型,如:where sms_id = #{smsId,jdbcType=VARCHAR}原创 2021-03-31 19:23:07 · 734 阅读 · 0 评论 -
feign:Method has too many Body parameters
在feign使用过程中,由于多个参数,导致如下错误:Method has too many Body parameters1、feign参数中,存在多个@RequestParam,但只能有一个@RequestBody。原创 2021-03-31 19:17:27 · 2254 阅读 · 0 评论 -
ORACLE +mybatis insert all批量插入使用序列unique constraint
使用insert all into 向oracle数据表中一次性插入多条数据的时候,使用序列号生成主键insert allinto test values(seq.nextval)into test values(seq.nextval)select 1 from dual;插入的多条数据获取的序列的值是一样的。建议采用触发器生成id。...原创 2021-03-10 13:12:26 · 1709 阅读 · 0 评论 -
Error getting generated key or setting result to parameter object
mybatis在保存的时候,报错:Error getting generated key or setting result to parameter object经过查看代码,发现是dao层中的insert上的标签导致:@Options(useGeneratedKeys = true, keyProperty = "sid",keyColumn="sid")由于采用自增主键,所以使用useGeneratedKeys标识出由数据库处理该字段。keyProperty是model中的字段名称,keyCo原创 2021-03-09 09:21:18 · 6639 阅读 · 0 评论 -
springboot报错 Cannot allocate memory
在一台8核16G的机器上,启动了10个springboot服务。均采用默认参数。于是就开始报错,因为系统内存不足,无法分配内存了。Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000079d380000, 314048512, 0) failed; error='Cannot allocate memory' (errno=12)## There is insufficient memory for t原创 2021-03-05 17:03:39 · 664 阅读 · 0 评论 -
ConditionalOnMissingBean ConditionalOnProperty
@ConditionalOnMissingBean和@ConditionalOnProperty均为spring的@Conditional的扩展注解。Conditional的意思是’附件…条件‘,顾名思义,以上注解的意思:是否满足注解指定的条件。@Conditional的扩展注解说明如下表:@Conditional扩展注解作用@ConditionalOnJava系统的java版本是否符合要求@ConditionalOnBean容器中存在指定Bean@Condition原创 2021-03-02 11:14:44 · 726 阅读 · 0 评论 -
generator各层生成器的oracle改造
一、前言由于要用到open-capacity-platform项目,而这个项目的oracle版本中没有对应版本的生成器,所以只能自己改造下。二、SysGeneratorDao.xml这个文件主要是获取表的元数据信息,位于项目中的/open-capacity-platform/business-center/generator-center/src/main/java/com/open/capacity/generator/dao位置。原始对应mysql的内容:<mapper namespace原创 2021-02-26 08:30:24 · 314 阅读 · 0 评论 -
PageHelper用于springboot+oracle分页
一、添加maven依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version></dependency>二、添加application.mxl配置pagehelper:原创 2021-02-24 10:57:08 · 1293 阅读 · 0 评论 -
ORA-28040:No matching authentication protocol Missing artifact com.oracle:ojdbc6
Missing artifact com.oracle:ojdbc6:jar:11.2.0.3根据下面链接下载(长期有效)。下载之后导入到本地maven库mvn install:install-file -Dfile=ojdbc6-11.2.0.3.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar资源位置:链接: https://pan.baidu.com/s/1t405BuRhAJ1Ej原创 2021-02-23 15:47:28 · 120 阅读 · 0 评论 -
newFixedThreadPool采坑记
前言线上环境使用ExecutorService.newFixedThreadPool来创建线程池。由于使用不当,导致线程大量执行重复任务。业务的要求是,一批线程执行完毕后,才能运行下一批线程。同时运行线程的最大数量就是coresize。上代码@Slf4jpublic class Test { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2);/原创 2021-02-19 09:16:03 · 1422 阅读 · 0 评论 -
springboot配置直接访问图片
一、前言在接触springboot之前,通过tomcat配置的虚拟目录来访问图片。或者通过nginx的静态资源来访问。在使用springboot后,发现可以配置直接访问静态资源。二、application.yml增加配置在application.yml中增加配置:spring: resources: static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,clas原创 2021-01-29 10:49:46 · 966 阅读 · 0 评论 -
Thumbnails进行图片处理:缩放、水印、裁剪
一、简介Thumbnailator是一个非常优秀的图片处理开源Java类库,处理效果极好,使用非常简单,极大的简化了代码量。同时支持批量处理。二、maven依赖<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version></dependency&g原创 2021-01-29 09:33:39 · 1998 阅读 · 0 评论 -
@Scheduled同步多线程配置
背景公司的老项目,由于开启了多个@Scheduled任务。却发现每个@Scheduled是总体顺序执行的。没有按照预期来跑。通过review代码后发现,@Scheduled的使用有些问题。是由于@Scheduled默认为所有的Scheduled共用一个线程导致。开启多线程配置注意,由于想让每一个任务都起一条线程去执行,要求必须每个执行完毕后才能再次执行,所以不能开启异步执行。不能添加@EnableAsync。ScheduleConfig.java@Configuration@EnableSche原创 2021-01-29 08:51:39 · 2255 阅读 · 2 评论 -
文件与字符串在MAC、LINUX、和java中计算md5
MAC平台:在命令行输入如下指令md5 filename结果如图:linux平台:在命令行输入如下指令md5sum filename | cut -d ' ' -f1结果如图所示:java代码中实现,apache的工具类,封装了文件、字符串的sha和MD5等。 public static String md5HashCode(InputStream fis) { try { if(fis == null){ return null; } ret原创 2020-12-14 08:19:08 · 280 阅读 · 0 评论 -
SimpleDateFormat线程不安全解决方案
1、将SimpleDateFormat作为局部变量,每次调用方法都实例化一个SimpleDateFormat对象,比较耗费资源。2、加锁,在使用的地方增加同步锁,性能差: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") synchronized (SimpleDateFormat.class) { try { date = sdf.parse("2020-12-11 00:00:00");原创 2020-12-14 07:53:22 · 211 阅读 · 0 评论 -
sts 运行java项目无法添加到servers中
在Servers中,想添加pom类型为war的war包运行的时候,发现无法发现war包,而包是存在的。发现项目的图标是J,而不是S项目右键,Properties-》Project Facets,勾选如下三项重启eclipse,或者重新导入项目即可。...原创 2020-12-02 12:59:17 · 420 阅读 · 0 评论