【实例简介】mysql eclipse tomcat开发,可直接发布使用

项目描述

该项目的架构搭建使用的是maven,后台是使用的是spring boot框架,数据库的CRUD使用的是注解的方式,权限管理使用的是shiro框架,前端使用的框架是jquery,bootstrap,highcharts4插件,主要有以下功能:用户管理、角色管理、日志管理、供应商管理、客户管理、商品管理、库存管理、进货/退货管理、商品报损,报溢管理、商品采购,销售统计、商品销售按日分析统计。

运行环境

jdk8 tomcat8 mysql IDEA maven

项目技术

Spring boot spring data jpa apache shiro bootstrap jquery highcharts4
使用当今最火的java框架springBoot

本系统采用企业级开发标准,使用SpringBoot架构,数据访问层采用Spring Data Jpa,业务控制层采用SpringMvc,安全框架采用Shiro,实现了完整权限系统,Controller方法采用shiro注解,来实现有效的权限控制;界面采用了Easyui技术;本视频教程详细讲解了次系统的完整开发,亮点是SpringBoot的综合应用,以及权限系统的设计,以及基于Shiro的安全控制,以及Easyui的高级应用工具:eclipse mysql JDK tomcat
技术:SpringBoot Spring Data Jpa SpringMvc Shiro安全认证 完整权限系统 easyui

文件:590m.com/f/25127180-492989525-bc357d(访问密码:551685)

【实例截图】


以下内容无关:

-------------------------------------------分割线---------------------------------------------

前言
在我们学习多线程开发的时候,在线程同时针对同一个资源进行操作的时候都需要加锁;一般会用到reentrantLock和synchronized两种锁方案,至于他们之间的区别也是面试的时候经常问到的,小伙伴们可自行网补。这里介绍企业经常用到的另一种锁,分布式锁。大家肯定听说过,但是就不一定用对哦。今天就深入的介绍一下分布式锁方案的演变。

常见用法
我们也不免俗套来举个并发扣除库存的例子

图片

我们来看一下代码

//扣除商品库存
//产品id: productId
//扣除数量: count
public void reduce(int productId,int count){
//步骤1 从数据库获得产品实体
Product product = getProduct(productId);
//步骤2 获得当前库存数量
int stockCount = product.getStock();
if(stockCount >= count){
//步骤3 扣除库存
product.setStock(stockCount - count);
//步骤4 把产品实体更新到数据库
productService.update(product);
log.info(“购买成功!”)
}else{
log.info(“库存不足,无法购买!”)
}
}
购买场景
当前产品的库存数为10

请求A买了2个产品,那应该扣除2

请求B买了3个产品,那应该再扣除3

那最终的库存剩余为5

上面代码在分布式环境中,只要稍微流量大点,这边就会出现扣减库存不是预期的情况。原因就是

图片

两个请求同时到来时,都同时执行了步骤1,在同一时刻都获取到了同一个产品库存当前库存都为10;但在步骤3的时候都是用10减count值,那么不管是请求A和请求B哪个先执行步骤4,库存剩余要么剩余是8或者7;都不是最终的5。

原因知道了,那怎么解决?小伙伴想到的就是弄个锁,而且还要分布式锁。

分布式锁登场
上面的问题很多小伙伴应该都知道要用分布式锁,那用什么技术方案呢?我相信很多小伙伴都会说用redis方案,很简单setnx就行了。

setnx命令 是redis的一条原生命令大意为 set if not exists, 在指定的key不存在的情况下,命令执行成功,如果key存在就命令执行不成功。

这个方案是很多公司都这么用的,那我们调整一下代码

图片

需要考虑到一些业务异常,需要把锁释放掉,加上try/finally,这个千万不要忘了

当是还是有一些问题,就是如果加锁成功后,业务没有完成。突然断电或者运维人员用kill -9命令把线程删除了;那就导致了锁一直没有释放,因为不会执行finally里面的代码了。

那怎么办呢?有经验的小伙伴应该就知道解决方案了

优化分布式锁
方案还是比较简单的,加个过期时间就行了

图片

这样即使断电,过了10秒钟之后锁也会自动过期,也就是失效;别的请求就可以正常请求了

现在到了这里,就是很多公司应用分布式锁的常用方案了。小伙伴们这样就没有问题了吗

问题分析
我们来看看问题出现在哪里?我们来调整一下业务代码

图片

因为我们扣库存的业务,不可能像写的很简单的业务;正式场景中业务是比较多的,不可能就这么简单;如果业务代码执行的时间超出了锁的过期时间,那么锁到期失效了,但业务代码还没有执行完;这种场景就会导致数据错乱。

那这个问题怎么解决呢?

解决思路
这个问题的本质是锁在没有执行完成业务时,到期失效了;那我们可以不让他失效不就行了吗?那怎么不让他失效呢?

方案很简单

启动一个后台线程,可以每3秒或者5秒执行一次,找到这个锁的key,延长这个锁key的过期时间;这样就达到了锁过期时间续期的功能了。是不是很简单?

我们自己写代码去实现是没有问题的,但是现在市面上已经有了轮子了,不需要我们自己再去写这个代码了,直接用人家的轮子;这个就是大名鼎鼎的Redisson。

java web进销存相关推荐

  1. 毕业设计 - java web 进销存管理系统的设计与实现【源码+论文】

    文章目录 前言 一.项目设计 1. 模块设计 系统需要具备以下功能 2. 实现效果 二.部分源码 前言 今天学长向大家分享一个 java web 项目: 进销存管理系统的设计与实现 一.项目设计 1. ...

  2. JAVA超市进销存管理系统计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA超市进销存管理系统计算机毕业设计Mybatis+系统+数据库+调试部署 JAVA超市进销存管理系统计算机毕业设计Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开 ...

  3. 编程小白一个月开发一套WEB进销存系统

    一个完全不懂编程的人在一个月内开发出一套WEB进销存系统,这听上去感觉有点不可思议,但这的确是事实.当然,如果靠去学会编程语言然后动手开发,这么短时间完成项目是不可能了,所以运用好工具才是关键. 进销 ...

  4. 【附源码】计算机毕业设计JAVA仓库进销存管理系统

    [附源码]计算机毕业设计JAVA仓库进销存管理系统 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Int ...

  5. java中为什么药导包,Java药品进销存管理系统

    需求分析 基于JavaWeb实现一个药品进销存管理系统, 也可以为其他类型的商品进销存管理系统, 该系统使用了jsp, struts2, mysql, bootstrap能技术, 能够为企业快速管理药 ...

  6. java超市进销存系统_Java超市进销存系统完整版JAVA源码下载

    Java超市进销存系统完整版 (3 folders, 4 files, 40.88 KB, 6.18 MB in total.) main_from.gif 724 bytes 软件说明.do ...

  7. 基于java 企业进销存管理系统设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 企业进销存管理系统 摘要 [摘要] 进销存管理系统是一个基于Internet的应用系统,它是一个 ...

  8. java sql进销存_[内附完整源码和文档] 基于Java和Sql Server 2008的陶瓷工厂进销存管理系统...

    摘 要 时代在进步,我们的生产生活方式当然也要相对应的做出改变了.在今天这样一个信息化的时代,计算机软件已经广泛的被用于日常的办公,仓库的库存管理,企业的人员以及资产管理,文字的编辑处理,电子表格的广 ...

  9. java开发进销存系统_java进销存系统

    [实例简介] java进销存系统,用到Swing/awt,以及mysql数据库 [实例截图] [核心代码] jinxiaocun └── jinxiaocun ├── bin │   └── com ...

最新文章

  1. 树莓派 Linux 备份,Turtlebot3中级教程-树莓派系统备份与恢复
  2. 如何造出逼真图像?南洋理工Zheng博士论文《基于深度生成学习的逼真图像合成》197页pdf阐述视觉合成工作...
  3. C++生成随机数:X2(卡方)分布(X2 distribution)
  4. VC++获取屏幕大小第三篇 物理大小GetDeviceCaps 下
  5. 组合逻辑与lamda算子的历史 英文
  6. 大工13秋《专业英语(计算机英语)》在线测试2,大工13秋《专业英语(计算机英语)》在线测试2答案...
  7. spark sql中的窗口函数
  8. python函数模块讲解_课堂练习讲解_模块化函数封装
  9. visualvm远程jvm_如何使用VisualVM监视服务器上的多个JVM
  10. 用模板写单链表 尹成
  11. ubuntu下使用UVC摄像头
  12. 超好用的webssh(支持秘钥登录)
  13. SQL:MongoDB简述
  14. 游戏计算机代码大全,DNF各类错误代码大全及解决方法
  15. 高效能人士的七个习惯-第二章-阅读
  16. 华中科技大学计算机考研信息汇总
  17. web开发技巧-Worker
  18. 浙大玉泉校区-武林门民航售票处-萧山机场
  19. Photoshop软件介绍
  20. 编解码学习笔记(三) Mpeg系列——Mpeg 1和Mpeg 2

热门文章

  1. android nfc刷卡广播,Android关于NFC的简单使用
  2. 上了大学,要记得多打电话和爸妈唠嗑
  3. python爬虫登录正方教务管理系统获取成绩数据
  4. java 排除法定节假日以及正常周六日,计算两个Date相差的小时数
  5. 被阿里 P10 面试了,评价:有点水平
  6. 社交产品出海机会再思考
  7. leetcode 322: 零钱兑换
  8. 关于index fast full scan 和 index full scan
  9. 如何清除 windows 10 [电影与电视]曾打开的文件记录
  10. Unity3D音乐音效学习