+ -
当前位置:首页 → 问答吧 → 帮忙解决mysql存储过程的缓存问题

帮忙解决mysql存储过程的缓存问题

时间:2011-09-20

来源:互联网

现有mysql存储过程如下:
delimiter //

CREATE PROCEDURE sequence  

 ( IN seqName varchar(30),

  OUT val INT )

BEGIN 

  declare maxValue int;

  declare minValue int;

  declare nowValue int;  

  select min_value,max_value,seq_value into minValue,maxValue,nowValue from comm_seq where seq_name=seqName for update;

  if nowValue<maxValue then
 
  update comm_seq set seq_value=seq_value+1 where seq_name=seqName; 
   
  else 

  update comm_seq set seq_value=minValue where seq_name=seqName;
 
  end if;

  select seq_value into val from comm_seq where seq_name=seqName;  

  commit;
  
END;

//
希望加上缓存机制,一次取出20个序列号,分配完后再重新拿到20个序列号。

作者: zhangna08   发布时间: 2011-09-20

解释一下 希望加上缓存机制 的意思?

作者: wwwwb   发布时间: 2011-09-20

oracle中的序列有缓存机制。我希望这个存储过程能简单模仿它的缓存机制。

作者: zhangna08   发布时间: 2011-09-20

呵呵, MYSQL不是oracle,没有缓存机制

作者: wwwwb   发布时间: 2011-09-20

加入缓存机制的问题。

作者: lzd_83   发布时间: 2011-09-20

OR
如果你知道ORACLE的缓存机制,看看能否在MYSQL中用代码实现(可能要修改源码)

作者: wwwwb   发布时间: 2011-09-20

实现序列号的自增,如果加上缓存机制,运行速度会快一些。一次请求分配20个序列号,20个序列号在内存中,如果没有用完,直接用内存的已生成好的就可以了。有点数据库缓冲池的意思。这是我的理解。我对mysql对于缓存这块的支持了解很少。

作者: zhangna08   发布时间: 2011-09-20

如果是自增,插入后,可以用LAST_INSERT_ID() 得到,在网络上要考虑并发

作者: wwwwb   发布时间: 2011-09-20

oracle中序列的生成用了缓存机制,开启了线程,mysql的存储过程中能开启线程吗?

作者: zhangna08   发布时间: 2011-09-20

引用 8 楼 zhangna08 的回复:
oracle中序列的生成用了缓存机制,开启了线程,mysql的存储过程中能开启线程吗?

MYSQL在存储过程开启线程?不能

作者: wwwwb   发布时间: 2011-09-20

如果是自增,插入后,可以用LAST_INSERT_ID() 得到,在网络上要考虑并发

很对,所以才用mysql存储过程实现,生成4位有序数。

作者: zhangna08   发布时间: 2011-09-20

那仅利用上面的存储过程去生成Id号的后四位,您觉得有问题吗?性能、效率方面。

作者: zhangna08   发布时间: 2011-09-20

用SP实现,同样要考虑并发,MYSQL没有oracle中的序列缓存机制

作者: wwwwb   发布时间: 2011-09-20

mysql在存储过程中没有缓存

作者: lanbaibai   发布时间: 2011-09-20

用SP实现?能详细一些吗?

作者: zhangna08   发布时间: 2011-09-20

spring吗?spring框架对这方面有支持吗?

作者: zhangna08   发布时间: 2011-09-20

引用 14 楼 zhangna08 的回复:
用SP实现?能详细一些吗?

思路:
取得起始值(加上FOR UPDATE)->加+1->写回表中

不如自增方便

作者: WWWWA   发布时间: 2011-09-20

这个不能在数据库端实现

作者: rucypli   发布时间: 2011-09-20

MYSQL中无法实现。

你可以通过存储过程近似的实现。 上次好像已经告诉过你了。 

另外创建一个表 create table seq(sid int auto_increment primary key);

然后你可以直接 insert into seq values (null),(null),(null); 一次占用三个号码。并且通过last_insert_id 得到第一个号码。

作者: ACMAIN_CHM   发布时间: 2011-09-20

建议放到程序端,而不是数据库端。

作者: shine333   发布时间: 2011-09-20

相关阅读 更多

热门下载

更多