有关软件开发编程知识及学习心得
7月4

当我们安装了redis服务后,发现在其配置文件redis.windows.conf(或redis.conf)设置了密码:requirepass ******

但是打开redis-cli.exe后输入命令config get requirepass发现:

这说明配置文件中密码设置后没有生效。

原因:问题在于我们启动redis服务时是直接在其安装目录中双击redis-server.exe启动的,这样启动的结果是,配置文件不会指定,此时redis并不会自动使用安装目录下的redis.windows.conf(或redis.conf)文件

红线框住的的提示说的很明确“ Warning: no config file specified”没有指定配置文件

解决方法:

法1:实际上我们直接在安装目录中启动redis服务时错误的,正确的方式是打开“运行”,键入“cmd”切到安装目录后输出redis-server.exe redis.windows.conf,回车,就可以了。

法2:在redis安装目录下新建文件startup.bat后,右击“编辑”,或者先用记事本建立该文件,再把扩展名改一下,文件里面写上:redis-server.exe redis.windows.conf。保存,以后再运行就直接运行这个文件,不要再直接运行redis-server.exe了,就可以了。

6月18
一、问题原因
2、原因:后台传过去的json数据用了阿里的fastjson转换,但是解析list中引用的数据时,jvm会自动将其处理为“循环引用”,因此,也就出现了问题{" r e f " : " ref":" ref":".data[0].children[0]"},数据以引用的方式传给前台,前台却无法解析到那段引用的数据。

循环引用就是:当一个对象包含另一个对象时,fastjson就会把该对象解析成引用。

二、解决方案
JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect)

用这种转换方式,把list替换成你要转换的数据就可以了。
6月14
1.在gitlab上找到你要回滚的那个版本 ,复制那次提交的id

点击在新窗口中浏览此图片

2.输入指令,回滚到指定的版本

git reset --hard 复制的id


3.推送到远端(强推)

git push -f origin master
5月17
sql执行正常的,但是放到mybatisPlus中执行错误报: Failed to process, please exclude the tableName or statementId.

大概率是存在特殊字符使mybatis解析异常
1.在mapper.java中的方法上添加@SqlParser(filter=true)注解
点击在新窗口中浏览此图片

2.如果sql中有注释,删掉注释
点击在新窗口中浏览此图片
4月7
(一)事务传播机制 7种

    Required (默认):

        如果当前没有事务,就新建一个事务,如果已存在一个事务中

        加入到这个事务中,这是最常见的选择。

    Supports :

        支持当前事务,如果没有当前事务,就以非事务方法执行。

    Mandatory :

        中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。

    Requies_new :

        创建一个新事务,如果当前事务存在,把当前事务挂起。

    Not_Supported :

        无事务执行,如果当前事务存在,把当前事务挂起。

    Never :

         无事务执行,如果当前有事务则抛出Exception。

    Nested :

        嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。

        如果当前事务不存在,则表现跟REQUIRED一样。



    注解配置时如:@Transactional(propagation=Propagation.REQUIRED)

    7种事务举例子可看此篇博客 感觉不错: https://www.cnblogs.com/myseries/p/10800430.html

(二)事务隔离级别


         事务隔离级别                       脏读              不可重复读          幻读
读未提交(Read-Uncommitted)      是                            是                    是
不可重复读(Read-Committed)      否                           是                    是
可重复读(Repeatable-Read)              否                         否                    是
串行化(Serializable)                      否                           否                    否
   注解配置时如:@Transactional(isolation = Isolation.READ_UNCOMMITTED)

  Mysql 默认 可重复读   ---repeatable-read

  事务的并发问题

    1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

    2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,

       对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

    3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,

         但是系统管理员B就在这个时候插入了一条具体分数的记录,

        当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

    小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。

              解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

3月14
项目中的一些依赖由于需要手动添加,很多时候都会创建一个私服仓库,比如nexus,将第三方jar添加到私服中,然后在pom中引用。刚来公司接手一个3年前的一个项目,该项目之前下过依赖,这些依赖本地依旧存在,如今重新导入该项目,由于没了私服,于是删去私服地址后,执行mvn package后项目会重新到配置的仓库中找这些依赖下载。

此时会报错"was cached in the local repository..." 或者 " Could not resolve dependencies for project"

解决方法,找到该依赖本地资源库位置,删去_remote.repositories文件 和 xx.lastUpdated文件
1月6
使用场景,多个接口的某个或多个参数都是从登录态中获取的,如下的capCode,这里只设计修改入参。
@Order(1)
@Component
@Aspect
@Slf4j
public class CapCodeAspect {

    @Autowired
    private TokenService tokenService;

    public CapCodeAspect() {
    }

    @Pointcut("@annotation(com.xx.oo.annotation.CapCode)")
    private void parameterPointCut() {
    }

    @Around("parameterPointCut()")
    public Object getCapCode(ProceedingJoinPoint joinPoint) {
        try {
            Object[] o = joinPoint.getArgs();
            if (null != o) {
                for (Object ob : o) {
                    changObjectValue(ob, "capCode", gatCapCode());
                }
            }
            return joinPoint.proceed(o);
        } catch (Throwable e) {
            log.error("目标方法执行异常,目标类:" + joinPoint.getTarget() + "方法:" + joinPoint.getSignature().getName(), e);
            throw new RuntimeException("系统繁忙,请稍后再试!");
        }
    }


    /***
     * 修改入参具体字段值
     */
    private Object changObjectValue(Object obj, String filedName, Object afterValue) throws Exception {
        Class<?> resultClz = obj.getClass();
        //获取父类的字段,因为capCode放在在基类里面,这里就直接获取父类的Class了,
//参数只在当前类的可以添加当前类的逻辑
        Field[] fieldInfo = resultClz.getSuperclass().getDeclaredFields();
        for (Field field : fieldInfo) {
            if (filedName.equals(field.getName())) {
                field.setAccessible(true); //成员变量为private,故必须进行此操
                Object fieldValue = field.get(obj);
                field.set(obj, afterValue);
                break;
            }
        }
        return obj;
    }


    private String gatCapCode() {
        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        SysUser user = loginUser.getUser();
        String capCode = user.getProviderId();
        log.info("资金编码:{}", capCode);
        return capCode;
    }


}
10月20
remote: The project you were looking for could not be found.

在使用Git客户端克隆和pull远程仓库的时候报错:提示找不到上游仓库,但是地址是正确的!

问题原因解析:

因为自己的项目不止一个 又有自动保存git密码的功能,当clone第二个项目的时候和之前的git用户不是同一个就会报这个错误!

解决方案:

在自己的项目路径上加上自己的用户名,
例如:
Git clone http://10.1.100.1:0000/credit/code/heck.git (失败)
Git clone http://用户名@10.1.100.1:0000/credit/code/heck.git(成功)

或者clear掉之前拉的项目保存的用户名和密码认证的数据。
10月8
mybatis 映射文件中,if标签判断字符串相等,两种方式:
因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候,
1.
<if test="signUpFlag=='Y'.toString()">

2.
<if test = 'signUpFlag== "Y"'>
注意:
不能使用
<if test="signUpFlag=='Y'">
and 1=1
</if>

因为mybatis会把'Y'解析为字符char类型,而不是String类型,不能做到判断的效果,java是强类型语言,所以不能这样写。

注意点:
mybatis中判断字符串为某一个值,必须+toString() 或者 flage=="xxx" (双引号),否则无法进入该判断
9月24
解决方法
写入excel时使用 SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook , 1000);只在内存中留1000行,不会占用过多的内存。下面只贴了部分代码。

public static void createExcelByTrade(List mergeCellConfigList ,  Map cellConfMap , List dataList ,String tempPath , String fileName  ) {
        try {
          int  excelRowNum  = 0;      
          short fontSize = 12;        
          // 创建新的Excel 工作簿
          XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
          SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook , 1000);
                          
          Sheet sheet = workbook.createSheet(fileName);        
          // 设置合并表头        
          setMergeHeaderCellByTrade(   workbook,   sheet,    mergeCellConfigList ,  excelRowNum,   fontSize );
          excelRowNum ++ ;
          excelRowNum ++ ;
        
          //设置表头
          setHeaderCell(  workbook,   sheet,  cellConfMap ,  excelRowNum,   fontSize );
          excelRowNum ++ ;     //查询数据库中所有的数据  
          setCellData(   workbook,   sheet, cellConfMap,   dataList,   excelRowNum,   fontSize);                        
          // 新建一输出文件流
          FileOutputStream fOut = new FileOutputStream(tempPath);
          // 把相应的Excel 工作簿存盘
          workbook.write(fOut);
          //清空缓冲区数据
          fOut.flush();
          // 操作结束,关闭文件
          fOut.close();
          System.out.println("文件生成...");
        } catch (Exception e) {
            e.printStackTrace();
          System.out.println("已运行 xlCreate() : " + e);
        }
      }

分页: 1/18 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]