![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 62
夜晚在编程
有空就写写代码
展开
-
最佳实践-轻量级事务编程(绕开事务失效的坑)
1、代码中开启事务常见问题现象:方法加了@Transactional,同类中方法调用,事务未生效。原因:采用Spring aop注解事务方式,同类中方法调用不会进入AOP拦截。2、推荐方案 1、定义动作执行接口@FunctionalInterfacepublic interface IActionService { /** * 动作执行接口 * 事务 多线程 等可以封装 * */ void doAction();}2、定义事.原创 2021-04-16 09:56:27 · 244 阅读 · 0 评论 -
java开发规范-异常-错误码
错误码【强制】错误码的制定原则:快速溯源、简单易记、沟通标准化。说明: 错误码想得过于完美和复杂,就像康熙字典中的生僻字一样,用词似乎精准,但是字典不容易随身携带并且简单易懂。正例:错误码回答的问题是谁的错?错在哪?1)错误码必须能够快速知晓错误来源,可快速判断是谁的问题。2)错误码易于记忆和比对(代码中容易 equals)。3)错误码能够脱离文档和系统平台达到线下轻量化地自由沟通的目的。【强制】错误码不体现版本号和错误等级信息。说明:错误码以不断追加的方式进行兼容。错误等级由日志和错误码原创 2021-03-16 15:09:36 · 1312 阅读 · 1 评论 -
java进程cpu使用率高问题排查
以下对近期排查了一个生产cpu使用率高问题做个复盘:简单说下过程1、top查看耗时大进程2、再top -Hp 进程id,查看耗时高的线程。3、printf “%x\n” 线程id 转16进制,比如这里是4a714、jstack 19022 | grep 4a71 -A 50 找到线程执行栈信息。也可以jstack -l 进程号,看所有的,排查可疑。jstack信息如下:定位到关键代码:找到代码位置:再往下看:这里是可疑代码,通过日志信息中的业务代码入口,找到了相对的Excel模板原创 2021-03-04 11:25:35 · 258 阅读 · 2 评论 -
Java函数式接口(Functional Interface)
简单介绍函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口,并且使用@FunctionalInterface 进行注解。在jdk8中,引入了一个新的包 java.util.function, 提了几种分类场景,使java 8 的函数式编程变得更加简便。示例要实现一个场景,业务的执行实现和任务链实现分开。采用函数式编程进行抽象分离。如下定义了任务链的逻辑。有三个点:1、采用泛型定义业务数据类型2、业务的链条规则原创 2021-02-22 17:38:45 · 2950 阅读 · 3 评论 -
递归实现yaml配置转properties的keyvalue
如下代码:public class YamlConfig { private static String defaultName = "/application.yml"; private static Map<String, Object> map = new HashMap<String, Object>(); /** * 自定义sql前缀 */ private static String prefix_sql_biz = "fast.etl.sql原创 2021-02-20 14:41:09 · 317 阅读 · 2 评论 -
JDK各版本特性简要说明(JDK5-JDK9)
jdk1.9新特性1、Java 平台级模块系统当启动一个模块化应用时, JVM 会验证是否所有的模块都能使用,这基于 requires 语句——比脆弱的类路径迈进了一大步。模块允许你更好地强制结构化封装你的应用并明确依赖。2.Linking当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 J原创 2021-02-09 15:03:30 · 547 阅读 · 0 评论 -
自定义spring-boot-starter实现及配置说明
前言对于自定义的组件,可以通过自定义spring-boot-starter来达到开箱即用的目的。实例有这样一个公共组件data-author-column,这里是具体的逻辑实现。对它我们来自定义starter。创建两个工程,其实可以是一个,这里按照springboot的标准分类,定义两个。1、data-author-spring-boot-starter2、data-author-spring-boot-autoconfiguredata-author-spring-boot-starte原创 2021-02-07 18:37:22 · 1059 阅读 · 0 评论 -
Springboot自动装配原理说明
前言SpringBoot有四大核心:1、Starter,开箱即用组件。2、autoconfigure,自动装配,根据上下文完成bean的装配。3、Actuator,springboot 应用监控。4、Springboot CLI,提供基于命令行,快速构建Springboot应用。自动装配自动装配,及自动将bean装配到IoC容器。在Springboot应用中,自动装配是通过@EnableAutoConfiguration注解来开启的。而这个注解申明在启动类注解@SpringBootApli原创 2021-02-04 12:08:32 · 267 阅读 · 0 评论 -
java多线程volatile与synchronized使用说明
无锁代码测试测试代码public class TestThread2 extends Thread{ private static int count = 0; private static Object monitor = new Object(); public static void main(String[] args) { TestThread2 t1 = new TestThread2(); TestThread2 t2 = new TestThread2();原创 2021-02-01 11:39:31 · 211 阅读 · 0 评论 -
Spring容器初始化AbstractApplicationContext说明
看下面的代码注释 @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. // 为上下文做刷新 prepareRefresh(); // Tell the subclass to refresh the i原创 2021-01-29 11:05:44 · 192 阅读 · 0 评论 -
ClasspathResource路径问题解决
#前言在项目中工程以springboot jar形式发布,跟之前容器比少了一个解压目录,这个过程中出现了ClasspathResource的文件获取问题。具体如下:#故障情况本地springboot工程打成jar包发布,在以下代码r.getFile()获取类目录下模板Excel文件报错:cannot be resolved to absolute file path because it does not reside in the file system: jar#解决方案调整代码,直接获取原创 2020-06-10 11:08:26 · 7980 阅读 · 0 评论 -
docker下redash搭建实践
拉取资源从github上拉取redashgit clone https://github.com/getredash/redash.git创建docker服务进入到工程目录下,执行docker-compose up -d 命令cd redash/docker-compose up -d初始化表服务# Create tablesdocker-compose run --rm server create_db安装npm依赖包在工程根目录下执行命令 redash/npm insta原创 2020-10-23 15:39:36 · 344 阅读 · 0 评论 -
Linux下shell脚本处理从数据库导出数据
前言一个常见的需求,需要任务执行,自动化从数据库导出数据,并以Excel表格的形式发送。实践#!/bin/bashHOSTNAME="这里是ip地址"PORT="3306"USERNAME="username"PASSWORD="password"DBNAME="dbname"TABLENAME="table_name"DATE=`date "+%Y-%m-%d"`Path=/backupselect_sql='this is your sql'mysql -h${HOSTN原创 2020-08-25 12:13:32 · 1550 阅读 · 0 评论 -
python+selenium实践
一、 安装selenium python包在已配置的python环境下,安装selenium包Pip3 install selenium二、 安装Chrome驱动Chrome浏览器帮助中查看Chrome版本到Chromedriver官网,下载对应版本驱动,实操中官网打不开,找到个镜像地址http://npm.taobao.org/mirrors/chromedriver/Mac下安装:解压,得到一个chromedriver可执行文件:将Chromedriver移动到/usr/loc原创 2020-08-10 11:05:31 · 171 阅读 · 0 评论 -
mysql数据库表信息-字段信息获取方案实践
前言近期一个项目有字段权限需求,需要对用户、角色进行字段权限的配置。那么延伸出来一个需求:对字段配置主数据的初始化。这里所用的数据库产品是mysql,mysql的information_schema库中存有我们需要的信息。接下来一段代码处理。代码实践package com.xxx.init;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.原创 2020-07-27 14:50:48 · 224 阅读 · 0 评论 -
dbflute-sql拦截方案实践
前言接前面一篇 dbflute的使用小结项目上有这个需求 要拦截sql处理,否则每个功能点得重复处理。想着看看这个框架有没有支持扩展拦截的,结果没有。所以考虑重写相关类。解决方案-重写找到org.dbflute.s2dao.sqlcommand这个包下的TnAbstractTwoWaySqlCommand.class类,拿出源码重写了当中的execute方法。代码如下: public Object execute(Object[] args) { final Node ro原创 2020-07-27 10:09:02 · 285 阅读 · 0 评论 -
git-12个常用命令
git常用命令1、git clone git@xxxx:xx/xxx.git从远程库克隆到本地。2、git add --all / git add .git commit -m “内容描述”加入增量文件并提交本地分支3、git push origin master推送本地到远程master分支4、git pull origin master从远程master分支拉取增量如果远程存在增量,需要先pull 再push5、git init / git init -bare本地库创建6原创 2020-07-14 16:19:24 · 118 阅读 · 0 评论 -
gitlab私服搭建-gitlab-ce-12.1.3
前言可以说在公司中实践,都有文档私服库这样一个需求,这里我们选用gitlab来搭建。配置安装这里是在linux环境下搭建1.安装辅助yum install -y curl policycoreutils-pythonopenssh-serversystemctl enable sshdsystemctl start sshd #启动2.yum install postfix #安装邮件systemctl enable postfixvim /etc/po原创 2020-06-17 11:00:16 · 300 阅读 · 0 评论 -
Springboot2.1.1集成swagger2.8.0
#引入依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</原创 2020-06-10 14:32:18 · 392 阅读 · 0 评论 -
Mybatis-generator+maven实践
前言应用中数据库访问ORM框架采用mybatis,如果采用配置文件方式,那么配置文件怎么来,一种是按照规则手写,另一种是自动生成,当然本身也是可以实践这种自动生成的工具,只是mybatis已有相关生成插件,拿来用即可。原理这里比较简单,就用文字描述了:maven执行generator插件,解析配置,同数据库建立连接,获取指定表信息,并生成映射的java model文件和dao层的mapper及mapper配置文件,跟进配置中的目录信息,将以上三类文件写入对应的目录。实践配置插件在pom文件中加入原创 2020-06-16 20:04:40 · 303 阅读 · 0 评论 -
Maven自定义骨架工程
maven 骨架工程 archetype 创建 配置 使用原创 2020-06-03 21:13:45 · 388 阅读 · 0 评论 -
dbflute的使用小结
前言公司有个项目,之前是外包的,框架采用的是springmvc+spring+dbflute这样的方式。这个项目陆续有需求要上线,考虑到维护性,计划迁移到新的框架。但是迁移的工作量,相对较大,有些需求还是得在老的工程上调整,所以对这块框架代码做了了解熟悉。在这个熟悉过程中,采用了springboot集成的方式,接下来看下实践的过程。配置pom.xml配置<dependency> <groupId>org.dbflute</groupId>原创 2020-07-21 11:09:27 · 939 阅读 · 0 评论 -
异常【final class org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages】处理
错误信息Caused by: java.lang.IllegalArgumentException: Cannot subclass final class org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:657) at org.springframew原创 2020-07-20 10:16:45 · 387 阅读 · 0 评论 -
数据权限-数据列权限设计方案-mybatis(BoundSql)
前言项目实践中,基本都会有权限的需求,权限需求分为两大块:1、功能权限;2、数据权限。而数据权限又可在行和列上细分为两块,即数据范围权限:用户能看到哪些行的记录;数据字段权限:用户能看到这些行对应的哪些字段。本文以字段权限为例做一个demo展示。方案字段权限方案也有很多种,这里采用配置无权限字段,在sql查询前,对sql进行拦截过滤,剔除无权限字段。框架这里采用mybatis作为ORM框架。配置配置pom依赖 <!-- mybatis --> <dep原创 2020-07-06 17:30:52 · 2690 阅读 · 0 评论 -
springboot工程打包-jar&war&tomcat9
前言使用springboot构建工程,在打包方案中,我们多了一个选择,即jar包方式;同以往war方式相比,操作上更便捷。但是在实际过程中,具体选择哪种方式,需要根据视实际情况而定,比如需要多个应用放在一个web容器下运行,那么war包方式更适合。以下是两种方式的操作分享:jar包配置在pom.xml中配置打包类型配置:jar插件配置:这里默认的版本是2.0.0执行到工程目录下命令执行,或者在IDE中执行maven命令,这里以终端的示例:mvn clean package spr原创 2020-06-23 11:34:03 · 316 阅读 · 1 评论 -
Springboot2.1.1+shardingsphere3.1.0实践
前言业务的增长带来数据量增长,应用可以水平扩展,同样数据也需要考虑水平扩展,以下基于springboot2.1.1、shardingsphere3.1.0实践数据分片。对于shardingsphere组件,这里使用了sharding-proxy部分的配置功能;sharding-proxy配置支持数据分片、读写分离、数据分片+读写分离、数据治理。以下示例基于单业务库主从+读写分离+业务分表。配置配置pom.xml依赖 <dependency> <groupId>or原创 2020-06-15 20:42:53 · 503 阅读 · 0 评论 -
数据权限-数据字段列权限设计方案-mybatis(SqlSource)
前言在上一篇文章 数据权限-数据列权限设计方案-mybatis(BoundSql)中提到对boundsql修改,在新版mybatis下会失效。本文阐述通过sqlSource注入来达到目标。分析boundsql注入失效原因,来看下mybatis中MappedStatement类源码:/** * Copyright 2009-2019 the original author or authors. * * Licensed under the Apache License, Vers原创 2020-07-13 19:57:17 · 2449 阅读 · 0 评论 -
java开发规范-编程规范补充
编程规范补充正常表达式推荐使用预编译【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。说明:不要在方法体内定义:Pattern pattern = Pattern.compile(“规则”);属性拷贝推荐spring工具类BeanUtils【强制】避免用 Apache Beanutils 进行属性的 copy。说明:Apache BeanUtils 性能较差,可以使用其他方案比如 Spring BeanUtils, Cglib BeanCopier,注意均是浅拷贝原创 2020-12-29 14:42:23 · 301 阅读 · 3 评论 -
mybatis插入记录的主键自增赋值机制说明
前言现在的项目实践中,表设计一般采用自增主键,那么在这当中会涉及到数据插入后,获取插入数据主键的一个场景处理。对于这种情况,mybatis框架做了封装,提供了支持。代码说明通过debug方式,跟进执行路径,查看对应逻辑代码。1、找到执行入口这里的参数赋值有三个,但不包括id的赋值,id是由数据库自增。这里看到一个KeyGenerator的类型,这个名字name的很好,自说明性很好。2、看看keyGenerator的执行逻辑这里可以看出,参数类型的id依然是空,但是上图的sql执行已结原创 2020-12-28 15:21:39 · 877 阅读 · 2 评论 -
java开发规范-注释规约
注释规约类 属性 方法 必须用/** 的注释【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不得使用// xxx 方式。说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释;在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。抽象及接口方法必须使用javadoc注释【强制】所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、原创 2020-12-24 17:52:05 · 544 阅读 · 1 评论 -
java开发规范-控制语句
控制语句switch的case终止必须显示明确【强制】在一个 switch 块内,每个 case 要么通过 continue/break/return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default语句并且放在最后,即使它什么代码也没有。说明:注意 break 是退出 switch 语句块,而 return 是退出方法体。String类型参数 switch前,先判空【强制】当 switch 括号内的变量类型为 Stri原创 2020-12-24 15:18:26 · 335 阅读 · 0 评论 -
java开发规范-并发处理
并发处理单例对象的获取及对象中方法要保证线程安全【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。说明:资源驱动类、工具类、单例工厂类都需要注意。【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。正例:自定义线程工厂,并且根据外部特征进行分组,比如,来自同一机房的调用,把机房编号赋值给 whatFeaturOfGrouppublic class UserThreadFactory implements ThreadFactory {private fin原创 2020-11-27 12:20:35 · 464 阅读 · 0 评论 -
面向sql的快速ETL工具-使用说明
前言有需求要建数仓,自然就涉及到数据同步的需求。在这个项目的场景中,需要每天定时从各个业务系统拉取数据到数据仓库。基于这,便设计实施了一个面向sql的ETL工具。用好三张表t_etl, t_etl_execute, t_etl_data_source三张表。t_etl:用于配置etl任务,从哪些源库取什么源数据t_etl_execute: 对应t_etl中配置的任务,配置目标库,在目标库执行哪些操作t_etl_data_source:数据源配置信息。一个简单的示例从源库的源表t_produ原创 2020-10-30 17:57:15 · 708 阅读 · 0 评论 -
jvm监控三板斧实战-进程假死排查:jmap、jstat、jstack
问题应用在大批量任务执行一段时间进入假死状态。排查dump java进程jmap -dump:format=b,file=20201020.dump 726726是进程号结果通过mat分析,没啥问题。jstat -gcutil 726 5000jstat -gcutil pid 时间间隔毫秒每隔5秒 输出进程726 垃圾回收情况这里也是正常的查看死锁jstack -F pidjstack -F 726死锁到没有,但是有很多数据源线程阻塞。因此复盘代码,存在数据库连接没有主动原创 2020-10-28 12:33:19 · 2643 阅读 · 2 评论 -
java基于POI-3.14的Excel模板合并&模板解析
前言在一个老工程中涉及到了Excel作为合同模板的合并需求及合同模板中动态数据处理需求。因此,基于POI编写了这样一个组件。这里POI使用的版本是3.14。模板合并/** * Excel合并 行从上往下拼接 Workbook 面向接口 * @param towb * @param fromwb * @return */ private static Workbook merge(Workbook towb, Workbook fromwb) { // 默认取第一个sheet原创 2020-10-28 11:32:09 · 564 阅读 · 1 评论 -
java开发规范-集合处理
集合处理hashCode和equals二人转【强制】关于 hashCode 和 equals 的处理,遵循如下规则:1) 只要重写 equals,就必须重写 hashCode。2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。3) 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和 equals。说明:String 因为重写了 hashCode 和 equals 方法,所以我们可以愉快地原创 2020-10-27 16:27:26 · 533 阅读 · 2 评论 -
java开发规范-日期时间
日期时间日期pattern 年份yyyy Not YYYY【强制】日期格式化时,传入 pattern 中表示年份统一使用小写的 y。说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY 就是下一年。正例:表示日期和时间的格式如下所示:new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”)原创 2020-10-27 14:19:11 · 426 阅读 · 0 评论 -
mac下MAT安装workspace问题解决
下载安装介质https://www.eclipse.org/mat/downloads.php安装完成,拖到Application中找到应用位置,右击在包内容中,找到info.plist 文件修改,在array标签中增加workspace配置注意缩进。如果MacOS下没有workspace目录,需要新建。到这里就完成了。不明白,官方为啥没打补丁。。...原创 2020-10-22 20:40:56 · 315 阅读 · 0 评论 -
继承HashMap的类实现BeanPostProcessor接口,执行失效问题解决
问题场景代码实践中,碰到一个小问题,实现类A继承了HashMap 并实现了BeanPostProcessor接口。结果在应用启动,容器初始化工程并没有按照预期执行类A中postProcessBeforeInitialization实现方法。解决定义一个简单类,实现BeanPostProcessor,在B的postProcessBeforeInitialization方法中实现A要做的逻辑。...原创 2020-10-15 11:35:14 · 156 阅读 · 0 评论 -
java开发规范-OOP规约
OOP规约静态变量或方法访问,直接采用类名访问【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。凡是重写方法,必须加@Override注解【强制】所有的覆写方法,必须加@Override 注解。说明:getObject()与 get0bject()的问题。一个是字母的 O,一个是数字的 0,加@Override 可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。可变参数推荐在相同业务含义、参原创 2020-10-10 14:43:41 · 371 阅读 · 0 评论