当前位置: 首页 > news >正文

网页设计入门视频教程郑州网站seo

网页设计入门视频教程,郑州网站seo,东莞培训网站建设,保定网站建设平台分析例子: 举例:假设我们有一个文件上传的uploadFile方法,在这个方法中我们会先执行上传一个文件到分布式文件系统中的方法addMediaFilesToMinIO( ),上传成功后执行文件资源数据入库的addMediaFilesToDb( ),那么这个时候事务应该加在哪…

 例子:

举例:假设我们有一个文件上传的uploadFile方法,在这个方法中我们会先执行上传一个文件到分布式文件系统中的方法addMediaFilesToMinIO( ),上传成功后执行文件资源数据入库的addMediaFilesToDb( ),那么这个时候事务应该加在哪个方法上? 是否会有事务失效的问题?

 问题引出

先说结论:我们只将addMediaFilesToDb方法添加事务控制即可,uploadFile方法上的不需要加@Transactional注解,只给与本地数据库进行网络传输的方法加相应的注解,在开发时,不同的网络传输方法要抽离成单独的方法,但是要注意事务生效的条件。

正常情况下我们在外部uploadFile方法上加会生效,但是直接将@Transactional加在addMediaFilesToDb( )事务会失效,问题出在哪里呢?

原因分析

如果在uploadFile方法上添加@Transactional注解,代理对象执行此方法前会开启事务,如下图:

如果在uploadFile方法上没有@Transactional注解,代理对象执行此方法前不进行事务控制,如下图:

所以判断该方法是否可以事务控制必须保证是通过代理对象调用此方法,且此方法上添加了@Transactional注解。

现在在addMediaFilesToDb方法上添加@Transactional注解,也不会进行事务控制是因为并不是通过代理对象执行的addMediaFilesToDb方法。为了判断在uploadFile方法中去调用addMediaFilesToDb方法是否是通过代理对象去调用,我们可以打断点跟踪。

我们发现在uploadFile方法中去调用addMediaFilesToDb方法不是通过代理对象去调用。

如何解决呢?通过代理对象去调用addMediaFilesToDb方法即可解决。

先将addMediaFilesToDb方法提成接口

 /*** @description 将文件信息添加到文件表* @param companyId  机构id* @param fileMd5  文件md5值* @param uploadFileParamsDto  上传文件的信息* @param bucket  桶* @param objectName 对象名称* @return com.xuecheng.media.model.po.MediaFiles* @author Mr.M* @date 2022/10/12 21:22*/public MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName);

在MediaFileService的实现类中注入MediaFileService的代理对象(注入自己交托spring管理成为代理对象),如下:

@Autowired
MediaFileService currentProxy;

在uploadFile方法中将调用addMediaFilesToDb方法处代码改为

MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);

再次debug可以看到对象为代理对象,并且可以通过加入int i = 1/0,观察十五是否回滚测试addMediaFilesToDb上加事务是否生效。

 

完整代码

package com.xuecheng.media.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.j256.simplemagic.ContentInfo;
import com.j256.simplemagic.ContentInfoUtil;
import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.media.mapper.MediaFilesMapper;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;
import com.xuecheng.media.service.MediaFileService;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.io.File;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;/*** @author Mr.M* @version 1.0* @description TODO* @date 2022/9/10 8:58*/
@Slf4j
@Service
public class MediaFileServiceImpl implements MediaFileService {@AutowiredMediaFilesMapper mediaFilesMapper;@AutowiredMinioClient minioClient;@AutowiredMediaFileService currentProxy;
// 存储普通文件@Value("${minio.bucket.files}")private String bucket_files;
// 存储视频文件@Value("${minio.bucket.videofiles}")private String bucket_video;//普通文件桶@Value("${minio.bucket.files}")private String bucket_Files;@Overridepublic PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto) {//构建查询条件对象LambdaQueryWrapper<MediaFiles> queryWrapper = new LambdaQueryWrapper<>();//分页对象Page<MediaFiles> page = new Page<>(pageParams.getPageNo(), pageParams.getPageSize());// 查询数据内容获得结果Page<MediaFiles> pageResult = mediaFilesMapper.selectPage(page, queryWrapper);// 获取数据列表List<MediaFiles> list = pageResult.getRecords();// 获取数据总数long total = pageResult.getTotal();// 构建结果集PageResult<MediaFiles> mediaListResult = new PageResult<>(list, total, pageParams.getPageNo(), pageParams.getPageSize());return mediaListResult;}//获取文件默认存储目录路径 年/月/日private String getDefaultFolderPath() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String folder = sdf.format(new Date()).replace("-", "/") + "/";return folder;}//获取文件的md5private String getFileMd5(File file) {try (FileInputStream fileInputStream = new FileInputStream(file)) {String fileMd5 = DigestUtils.md5Hex(fileInputStream);return fileMd5;} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据扩展名获取MimeType* @param extension* @return*/private String getMimeType(String extension) {if (extension == null) {extension = "";}//根据扩展名取出mimeTypeContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(extension);//通用mimeType,字节流String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;if (extensionMatch != null) {mimeType = extensionMatch.getMimeType();}return mimeType;}/*** 将文件上传到minio* @param localFilePath 文件地址* @param bucket        桶* @param objectName    对象名称* @return void* @description 将文件写入minIO* @author Mr.M* @date 2022/10/12 21:22*/public boolean addMediaFilesToMinIO(String localFilePath, String mimeType, String bucket, String objectName) {try {UploadObjectArgs testbucket = UploadObjectArgs.builder().bucket(bucket).object(objectName).filename(localFilePath).contentType(mimeType).build();minioClient.uploadObject(testbucket);log.debug("上传文件到minio成功,bucket:{},objectName:{}", bucket, objectName);System.out.println("上传成功");return true;} catch (Exception e) {e.printStackTrace();log.error("上传文件到minio出错,bucket:{},objectName:{},错误原因:{}", bucket, objectName, e.getMessage(), e);XueChengPlusException.cast("上传文件到文件系统失败");}return false;}/*** @param companyId           机构id* @param fileMd5             文件md5值* @param uploadFileParamsDto 上传文件的信息* @param bucket              桶* @param objectName          对象名称* @return com.xuecheng.media.model.po.MediaFiles* @description 将文件信息添加到文件表* @author Mr.M* @date 2022/10/12 21:22*/@Override@Transactional  // 在这里加注解public MediaFiles addMediaFilesToDb(Long companyId, String fileMd5, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName) {//从数据库查询文件MediaFiles mediaFiles = mediaFilesMapper.selectById(fileMd5);if (mediaFiles == null) {mediaFiles = new MediaFiles();//拷贝基本信息BeanUtils.copyProperties(uploadFileParamsDto, mediaFiles);mediaFiles.setId(fileMd5);mediaFiles.setFileId(fileMd5);mediaFiles.setCompanyId(companyId);mediaFiles.setUrl("/" + bucket + "/" + objectName);mediaFiles.setBucket(bucket);mediaFiles.setFilePath(objectName);mediaFiles.setCreateDate(LocalDateTime.now());mediaFiles.setAuditStatus("002003");mediaFiles.setStatus("1");//保存文件信息到文件表int insert = mediaFilesMapper.insert(mediaFiles);if (insert < 0) {log.error("保存文件信息到数据库失败,{}", mediaFiles.toString());XueChengPlusException.cast("保存文件信息失败");return null;}log.debug("保存文件信息到数据库成功,{}", mediaFiles.toString());}return mediaFiles;}/*** 上传文件** @param companyId           机构id* @param uploadFileParamsDto 上传文件信息* @param localFilePath       文件磁盘路径* @return*/
//    @Transactional 不要给这个方法加事务注解,细化到数据库传输方法加@Overridepublic UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, String localFilePath) {File file = new File(localFilePath);if (!file.exists()) {XueChengPlusException.cast("文件不存在");}//文件名称String filename = uploadFileParamsDto.getFilename();//文件扩展名String extension = filename.substring(filename.lastIndexOf("."));//文件mimeTypeString mimeType = getMimeType(extension);//文件的md5值String fileMd5 = getFileMd5(file);//文件的默认目录String defaultFolderPath = getDefaultFolderPath();//存储到minio中的对象名(带目录)String objectName = defaultFolderPath + fileMd5 + extension;//将文件上传到minioboolean result = addMediaFilesToMinIO(localFilePath, mimeType, bucket_files, objectName);if (!result){XueChengPlusException.cast("上传文件失败!");}//文件大小uploadFileParamsDto.setFileSize(file.length());//将文件信息存储到数据库MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);if (null==mediaFiles){XueChengPlusException.cast("文件上传后保存信息失败");}//准备返回数据UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();BeanUtils.copyProperties(mediaFiles, uploadFileResultDto);return uploadFileResultDto;}
}

结论

       在使用事务注解的时候要考虑与三方等网络传输的效率等问题,正确的使用事务。

http://www.dinnco.com/news/41776.html

相关文章:

  • 潍坊网站建设服务商谷歌搜索引擎363入口
  • 网站这么绑定到域名长春网站建设方案推广
  • 建设银行江苏省分行网站甘肃百度推广电话
  • 集团网站建设特色怎么创建网站赚钱
  • 蚌埠市住房建设部网站泰安seo培训
  • 北京海淀网站建设公司直播引流推广方法
  • 做网站能成功吗优化大师win10下载
  • 哪里可以做网站平台如何开通网站
  • 公司网站首页怎么制作淘宝店铺怎么运营
  • 网站业务需求文档河北seo技术培训
  • 做网站必须开厂吗互联网电商平台有哪些
  • 曲靖网站建设公司最近七天的新闻大事
  • 网站title字数长春网站优化流程
  • 起点数据网是谁做的网站如何投放网络广告
  • 百度新网站提交入口seo综合诊断工具
  • 做网站用什么语百度推广优化中心
  • 修改wordpress首页缩略图尺寸优化大师绿色版
  • 怎么自己做网站表白手机网站排名优化
  • 个人做网站外贸谷歌优化
  • 产品介绍网站模板下载地址神马seo教程
  • 深圳网站建设论坛百度网络推广
  • 南京住房和城乡建设部网站深圳网络推广大师
  • 在一个网站下建设多个子网站市场营销策略
  • jsp做网站能实现什么功能吉林网络推广公司
  • 网站内容的作用seo关键词排名技术
  • 如何免费自己做网站推广页面
  • 企业可以备案几个网站打开搜索引擎
  • 做品牌的人常用的网站谷歌seo工具
  • 设计网站页面要注意什么如何做运营推广
  • 大武汉论坛seo实战论坛