首页 > 其他 > 详细

工作中的一些小总结(4)

时间:2021-01-04 11:59:02      阅读:22      评论:0      收藏:0      [点我收藏+]

关于@Transactional的常见问题

在工作总结(2)里已经有提到部分常见问题,这里不再描述,下面这个问题是在自己不久前写业务代码时遇见的。
@TransactionalSynchronized同时作用与一个方法上时,仍然导致出现数据库脏写,脏数据的情况。
service层业务代码如下:
@Transactional
public synchronized ScheduleCommonWorkPlanVO insertMonthPlan(ScheduleCommonWorkPlanVO<ScheduleWorkWorkplanmonthVO> commonWorkPlanVO) {
    //业务逻辑。。。
    ScheduleWorkWorkplanmonthVO workplanmonthVO = commonWorkPlanVO.getWorkPlan();
    String monthPlanId = IdsUtil.getUUID32();
    if (workplanmonthVO != null) {
        //业务逻辑。。
    }
} 

问题原因:
@Transactional 是通过Spring AOP实现的,会在被代理方法执行完成后,没有异常提交事务入库,
在并发环境下 线程A 执行完方法 释放锁 此时还未提交事务,线程B 获取锁 执行方法 由于线程A 数据还未入库 导致线程B 读取到的数据还不是最新的,
就导致 线程A 和线程B 的编号 重复问题

解决方案:
1.在controller 层对service 方法进行加锁,使用 synchronized 或者 Lock
2.在controller 层使用分布式锁,推荐使用 Redisson,简单 高效,适合分布式场景

FTP下载文件时,对于中文名的文件出现下载后0kb的问题

![](https://img2020.cnblogs.com/blog/1243063/202101/1243063-20210104110802703-145492774.png)

主要是因为编码格式的问题,英文名的文件ftp使用的是GBK格式的编码,含中文的文件FTP使用的是ISO-8859-1的编码格式,所以如果在
ftpClient.retrieveFile(file.getName(),os);
这里对文件名转码的话ftp就找不到文件了,导致下载0kb
技术分享图片

除了上面的原因会出现0kb还有可能会因为工作路径设置不正确,也会导致各种错误
例如:
技术分享图片

本机设置的ftp根路径是 E:\jd\ftpserver\ ,ftp会以 / 作为根路径,在配置文件里设置路径时应使用完整路径,如:
技术分享图片

否则,在
ftpClient.changeWorkingDirectory(ftpConfig.getFtpTaskPath());
变更ftp的工作目录后,会导致文件下载失败

ftp切换中文路径时失败的问题


public FTPClient getFTPClient(){
    FTPClient ftpClient=new FTPClient();
    try {
        //必须在连接之前设置好ftp的编码格式,否则含中文路径的目录无法切换
        ftpClient.setControlEncoding("UTF-8");
        ftpClient.connect(host,port);
        ftpClient.login(userName,password);
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            System.out.println("连接ftp失败");
            ftpClient.disconnect();
        }else{
            System.out.println("连接ftp成功");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ftpClient;
}

ftp多线程下载文件时,速度慢的问题

以下以查看和修改eth0为例: 1. 查看MTU值

# cat /sys/class/net/eth0/mtu

  1. 修改MTU值

#echo "1460" > /sys/class/net/eth0/mtu

设置socket的缓存大小可以有效改善下载的速度
windows环境的ftp服务器可以通过软件修改socket缓存大小,如:
技术分享图片
linux 查看最大的发送缓冲区大小(tcp连接)
cat /proc/sys/net/core/wmem_max

查看最大的接收缓冲区大小(tcp连接)
cat /proc/sys/net/core/rmem_max

缺省的接收缓冲区大小(tcp连接)
cat /proc/sys/net/core/rmem_default

缺省的发送缓冲区大小(tcp连接)
cat /proc/sys/net/core/wmem_default

查看接收缓冲区:sysctl -a | grep rmem

修改配置文件:vim /etc/sysctl.conf
添加:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default=16777216
net.core.wmem_default=16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

使用 sysctl -p 让配置生效

工作中的一些小总结(4)

原文:https://www.cnblogs.com/lazyfox/p/14228487.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!