博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql提供sequence服务
阅读量:5876 次
发布时间:2019-06-19

本文共 2092 字,大约阅读时间需要 6 分钟。

hot3.png

使用mysql提供sequence的服务,我们在执行的一个方案:

1:创建sequence相关表

CREATE TABLE `seq_order_id` (  `seq` bigint(20) NOT NULL AUTO_INCREMENT,  `stub` varchar(3) NOT NULL,  PRIMARY KEY (`seq`),  UNIQUE KEY `stub` (`stub`)) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8;

2:获取seq时相关SQL:

REPLACE INTO seq_order_id(stub) VALUES (#stub#)SELECT last_insert_id()

这种方式可以一个表提供给多个业务做seq的服务,但是由于REPLACE INTO会有锁表状况存在,在业务量很大时,对数据库的性能影响较大。

3:修改为使用spring的org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer,方法加了同步锁,每次数据库操作会直接获取一个段的值cacheSize,业务分布式部署也不影响sequence的唯一性

@Override	protected synchronized long getNextKey() throws DataAccessException {		if (this.maxId == this.nextId) {			/*			* Need to use straight JDBC code because we need to make sure that the insert and select			* are performed on the same connection (otherwise we can't be sure that last_insert_id()			* returned the correct value)			*/			Connection con = DataSourceUtils.getConnection(getDataSource());			Statement stmt = null;			try {				stmt = con.createStatement();				DataSourceUtils.applyTransactionTimeout(stmt, getDataSource());				// Increment the sequence column...				String columnName = getColumnName();				stmt.executeUpdate("update "+ getIncrementerName() + " set " + columnName +						" = last_insert_id(" + columnName + " + " + getCacheSize() + ")");				// Retrieve the new max of the sequence column...				ResultSet rs = stmt.executeQuery(VALUE_SQL);				try {					if (!rs.next()) {						throw new DataAccessResourceFailureException("last_insert_id() failed after executing an update");					}					this.maxId = rs.getLong(1);				}				finally {					JdbcUtils.closeResultSet(rs);				}				this.nextId = this.maxId - getCacheSize() + 1;			}			catch (SQLException ex) {				throw new DataAccessResourceFailureException("Could not obtain last_insert_id()", ex);			}			finally {				JdbcUtils.closeStatement(stmt);				DataSourceUtils.releaseConnection(con, getDataSource());			}		}		else {			this.nextId++;		}		return this.nextId;	}

 

转载于:https://my.oschina.net/dreamnight/blog/729777

你可能感兴趣的文章
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>
驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
Template Method Design Pattern in Java
查看>>
MVC输出字符串常用四个方式
查看>>
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
nginx+php的使用
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>