论坛首页 Java企业应用论坛

高手问答:大话Java性能优化——公布获奖名单

浏览 13813 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2016-05-11  
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?
0 请登录后投票
   发表时间:2016-05-11  
感受微风 写道
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?

 
0 请登录后投票
   发表时间:2016-05-11   最后修改:2016-05-12
0 请登录后投票
   发表时间:2016-05-12  
感受微风 写道
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?

你把完整的相关类都发给我,我看一下逻辑。
0 请登录后投票
   发表时间:2016-05-12  
现在很多公司喜获考各种排序算法(快速排序,插入排序)。请问,这些排序算法对提升性能到底有多少,这些排序算法有没有一些实战的应用场景
0 请登录后投票
   发表时间:2016-05-12  
麦克周 写道
感受微风 写道
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?

你把完整的相关类都发给我,我看一下逻辑。


相关类已通过站内短信发给你。
0 请登录后投票
   发表时间:2016-05-12  
感受微风 写道
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?

你这个的场景,我是用guava的 Interners.newWeakInterner().intern(catId)做锁对象的。
你的事务边界是 codeGetFromLibrary()这个方法,还是codeLibraryDao.updateStatusById()?
0 请登录后投票
   发表时间:2016-05-12  
我是做web开发的,感觉现在的一些框架越来越完善,自己写的代码越来越少,想提升下自己。楼主有没有什么好的建议?比如大数据方向?
0 请登录后投票
   发表时间:2016-05-12   最后修改:2016-05-12
Saro 写道
感受微风 写道
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?

你这个的场景,我是用guava的 Interners.newWeakInterner().intern(catId)做锁对象的。
你的事务边界是 codeGetFromLibrary()这个方法,还是codeLibraryDao.updateStatusById()?



codeGetFromLibrary()这个方法,比如num是5 先取出5个码 然后改变码的状态  取码时有状态条件

guava的 Interners.newWeakInterner().intern(catId) 这个锁对象 锁的住么 你们测试过没
0 请登录后投票
   发表时间:2016-05-12  
感受微风 写道
流程:有个发券的业务,券是提前导入到数据库 码库表 里面,每当有请求过来时,就取出一条数据 放到 发券记录表,然后改变券的状态。
背景:springmvc,mysql   硬件暂时没条件提升
代码:取券时加了 synchronized ,但是还是锁不住
public  List<Integer> codeGetFromLibrary(String catId,int num){
//get code and update status
synchronized(CodeSendService.class){
List<Integer> list = codeLibraryDao.getCodeId(catId,num);
Date date = new Date();
for (int i = 0; i < list.size(); i++) {
codeLibraryDao.updateStatusById("4",list.get(i),date);
}
return list;
}
问题:当并发到一定程度时,就会出现两个请求取到同一个券数据,造成插入失败。 怎么样提高成功率和并发数?


你这段代码如果不是集群环境下不会出现并发问题,但是加锁后却不断访问数据库,可想效率不怎么样。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics