- 浏览: 249633 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (192)
- 技术研究学习 (19)
- 工作总结 (4)
- spring3.x (11)
- mail (2)
- jar (2)
- FCKeditor (1)
- quartz (2)
- json (1)
- jdbc (5)
- struts2 (6)
- java基础 (18)
- jboss (3)
- IT名称解析 (1)
- 测试工具 (2)
- 工作趣谈 (1)
- 数据库 (8)
- js (8)
- jquery (1)
- mysql (20)
- Sql (3)
- Oracle (1)
- easyui (0)
- log4j (1)
- 源码研究 (1)
- Jasper Report (0)
- Jbpm4 (4)
- xml (1)
- ireport (0)
- javavm (1)
- sitemesh (5)
- compass (1)
- jvm (1)
- ext (1)
- lucene (0)
- cxf (1)
- Blazeds (0)
- Resteasy (1)
- jaxb (1)
- tomcat (1)
- Rmi (1)
- BoneCP (1)
- velocity (3)
- OSCache (1)
- EHCache (1)
- 高性能开发 (9)
- 设计模式 (0)
- 网络协议应用 (1)
- Ibatis (1)
- powerdesigner (1)
- 架构师之路 (2)
- memcached (4)
- MapReduce (1)
- 测试组 (1)
- 图像处理 (2)
- LoadRunner (2)
- 报表 (1)
- 负载均衡 (1)
- 分布式 (3)
- c# (1)
- java中一些特殊问题 (3)
- java 8 (1)
- Mogodb (1)
- 项目设计与实现 (2)
- Ubuntu (1)
- eclipse (1)
- gradle (1)
- 私有云 (1)
- redis (1)
- 移动前端 (1)
最新评论
来源:http://www.2cto.com/database/201109/104252.html
在一般情况下,在新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键,在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里,如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值,对于高并发的系统,这很容易返回错误的主键。通过带缓存的DataFieldMaxValueIncrementer,可以一次获取批量的主键值,供多次插入领域对象时使用,它的执行性能是很高的。 使用数据库的自增主键 我们经常使用数据的自增字段作为表主键,也即主键值不在应用层产生,而是在新增记录时,由数据库产生。这样,应用层在保存对象前并不知道对象主键值,而必须在保存数据后才能从数据库中返回主键值。在很多情况下,我们需要获取新对象持久化后的主键值。在Hibernate等ORM框架,新对象持久化后,Hibernate会自动将主键值绑定到对象上,给程序的开发带来了很多方便。 在JDBC 3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中。使用Statement时,可以通过以下方法绑定主键值: int executeUpdate(String sql,int autoGeneratedKeys) 也可以通过Connection创建绑定自增值的PreparedStatement: PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) 当autoGeneratedKeys参数设置为Statement.RETURN_GENERATED_KEYS值时即可绑定数据库产生的主键值,设置为Statement.NO_GENERATED_KEYS时,不绑定主键值。下面的代码演示了Statement绑定并获取数据库产生的主键值的过程: Statement stmt = conn.createStatement(); String sql = "INSERT INTO t_topic(topic_title,user_id) VALUES(‘测试主题’,’123’) "; stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); ①指定绑定表自增主键值ResultSet rs = stmt.getGeneratedKeys(); if( rs.next() ) { intkey = rs.getInt();②获取对应的表自增主键值} Spring利用这一技术,提供了一个可以返回新增记录对应主键值的方法: int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) org.springframework.jdbc.support.KeyHolder是一个回调接口,Spring使用它保存新增记录对应的主键,该接口的接口方法描述如下: Number getKey() throws InvalidDataAccessApiUsageException 当仅插入一行数据,主键不是复合键且是数字类型时,通过该方法可以直接返回新的主键值。如果是复合主键,或者有多个主键返回时,该方法抛出InvalidDataAccessApiUsageException。该方法是最常用的方法,因为一般情况下,我们一次仅插入一条数据并且主键字段类型为数字类型; Map getKeys() throws InvalidDataAccessApiUsageException 如果是复合主键,则列名和列值构成Map中的一个Entry。如果返回的是多个主键,则该方法抛出InvalidDataAccessApiUsageException异常; List getKeyList(): 如果返回多个主键,即PreparedStatement新增了多条记录,则每一个主键对应一个Map,多个Map构成一个List。 Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该类返回新增记录时的自增长主键值。假设我们希望在新增论坛板块对象后,希望将主键值加载到对象中,则可以按以下代码进行调整: public voidaddForum(final Forum forum) { final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; KeyHolder keyHolder = newGeneratedKeyHolder();①创建一个主键执有者getJdbcTemplate().update(newPreparedStatementCreator(){ public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, forum.getForumName()); ps.setString(2, forum.getForumDesc()); returnps; } },keyHolder); forum.setForumId(keyHolder.getKey().intValue());②从主键执有者中获取主键} 这样,在调用addForum(final Forum forum)新增forum领域对象后,forum将拥有对应的主键值,方便后继的使用。 在JDBC 3.0之前的版本中,PreparedStatement不能绑定主键,如果采用表自增键(如MySql的auto increment或SqlServer的identity)将给获取正确的主键值带来挑战——因为你必须在插入数据后,马上执行另一条获取新增主键的查询语句。表1给出了不同数据库获取最新自增主键值的查询语句: 表1 不同数据库获取新增加的主键值 数据库 获取新增主键的查询语句 DB2 IDENTITY_VAL_LOCAL() Informix SELECT dbinfo('sqlca.sqlerrd1') FROM <TABLE> Sybase SELECT @@IDENTITY SqlServer SELECT SCOPE_IDENTITY()或SELECT @@IDENTITY MySql SELECT LAST_INSERT_ID() HsqlDB CALL IDENTITY() Cloudscape IDENTITY_VAL_LOCAL() Derby IDENTITY_VAL_LOCAL() PostgreSQL SELECT nextval('<TABLE>_SEQ') 如果数据库的并发率很高,比如在插入记录后执行查询主键之前,数据库又执行了若干条插入记录的SQL语句,这时,通过表1 返回的主键值就是最后一条插入语句的主键值,而非我们希望的主键值了。所以使用查询语句获取表自增键值是不安全的,这也是为什么有些数据库(如Oracle、Firebird)故意不提供自增键,而只提供序列的原因,序列强制要求你在新增记录前,先获取主键值。Oracle通过SELECT <SEQUENCE_NAME>.nextval FROM DUAL获取序列的下一个值,而FireBird通过SELECT GEN_ID(<SEQUENCE_NAME> 1) FROM RDB$DATABASE获取序列的下一个值。在10.4.1小节中,我们还将讲解应用层自增键的相关知识。 作者“ERDP技术架构”
发表评论
-
查看sql语句执行时间/测试sql语句性能
2013-08-20 11:22 1649写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务 ... -
SQL Server 2005 中的分区表和索引
2013-08-06 11:46 688http://msdn.microsoft.com/zh-cn ... -
SQLServer如何查询所有表所有字段包含某某的信息
2013-07-23 10:44 755从系统表自动生成sql语句来运行得到结果 select a ... -
SQLServer如何查询所有表所有字段包含某某的信息
2013-07-23 10:43 915从系统表自动生成sql语句来运行得到结果 select a ... -
sum()over()
2012-09-25 13:40 819所用数据: SELECT a.deptno, a.emp ... -
不同数据库mysql、oracle 、sql 长度的不同表示函数
2012-09-21 16:52 983在 SQL 中,長度函數是用來找出一個字串的長度。這個函數 ... -
sql查询当月,本天,本周,本月的记录Sql代码
2012-08-24 13:44 2756sql查询当月,本天,本周的记录Sql代码 --查询当天: ...
相关推荐
Spring框架提供了多种主键生成策略,其中`GenerationType.IDENTITY`是最直接对应于数据库自增主键的方式。然而,为了更好地适应各种应用场景,Spring还支持`GenerationType.TABLE`、`GenerationType.SEQUENCE`以及`...
1. 自增主键:这是单机数据库常见的主键生成方式,但在分布式环境中,自增可能会导致主键冲突。为解决此问题,可以使用全局自增序列,如Twitter的Snowflake算法,它结合时间戳、工作节点ID和序列号生成全局唯一的64...
在 Oracle 数据库中,与许多其他关系型数据库系统不同,它并没有内置的自动自增字段类型,例如 MySQL 的 `AUTO_...需要注意的是,虽然这种方法很实用,但在高并发环境下可能需要考虑序列值的并发问题,以及性能优化。
- 自增列的插入操作相比非自增列可能会有性能下降,因为需要对系统表中的最大自增值进行加锁操作,这在高并发环境下可能导致资源竞争。 4. **模块设计** - 系统表的设计包括在`__all_all_column`中添加自增属性,...
在高并发环境下,如果不正确地使用序列,可能会导致序列值的跳跃或重复。例如,如果两个事务同时获取了同一个序列值,但只有一个事务成功提交,那么序列就会跳过一个值。因此,设计好并发控制机制是非常重要的。 6....
【正文】 Mycat 是一款开源的分布式...正确理解和配置这些参数,对于构建高可用、高性能的分布式数据库系统至关重要。在实际应用中,需要根据业务需求和系统规模,选择合适的主键生成策略,并进行适当的性能调优。
本测试报告针对MySQL和Cedar 0.3两个数据库系统,通过对比主键自增和非主键自增在性能上的差异,深入探讨了它们在高并发场景下的表现。 测试环境包括了多台配置各异的服务器,CPU为Intel(R) Xeon(R) CPU E5-2620,...
【大数据量高并发的数据库优化】是IT领域中一个至关重要的主题,特别是在现代互联网应用和服务中,数据库的性能直接影响到用户体验和系统稳定性。本篇内容主要涵盖了数据库优化的多个方面,包括数据库结构设计、查询...
自增主键是最常见的主键类型,通常使用INT或BIGINT数据类型。INT占用4字节,最大可表示2147483648,适合存储较小的数据量。若预期数据量可能超过这个范围,应选用8字节的BIGINT,它的最大值远高于INT,可满足更大的...
在高并发环境下,如果多个用户同时插入数据,可能会出现多个请求获取到同一个序列值的情况,导致主键冲突。为解决这个问题,一种常见的优化策略是在触发器中添加锁定机制,例如使用`SELECT ... FOR UPDATE NOWAIT`来...
这样可以测试在高并发环境下主键生成器的性能和正确性。 值得注意的是,虽然这个示例能生成唯一的主键,但其生成的主键可能会有重复,特别是在短时间内大量生成的情况。因为时间戳的精度只有到毫秒,如果在同一毫秒...
在当今的大数据时代,数据库的优化...以上是大数据量高并发数据库优化的主要知识点,通过合理的数据库结构设计、表设计以及查询优化,可以显著提升数据库的性能和稳定性,为大数据量和高并发的业务场景提供有力支撑。
在MySQL数据库管理中,自增长主键是一种常见的设计模式,主要用于自动为每一行记录生成一个唯一...然而,值得注意的是,这种方法可能会带来额外的查询开销,因此在高并发环境下需谨慎使用,并考虑其对系统性能的影响。
MySQL中的自增ID是表设计中的一...总结来说,理解并正确使用MySQL的自增ID特性至关重要,特别是对于高并发和大量操作的环境。定期审查和优化数据库操作,以及实施适当的监控机制,可以有效地预防和解决自增ID超大问题。
值为12表示使用本地内存作为序列生成器,这通常适用于小型或中型应用,因为它的性能较好,但不适用于高并发环境,可能导致序列冲突。 2. 更新`schema.xml`: 在`schema.xml`中,你需要为涉及主键自增的表添加特定...
- **性能优化:** 在高并发场景下,频繁地使用`LAST_INSERT_ID()`或`getGeneratedKeys()`可能会对性能产生影响,可以通过批量插入等方式进行优化。 通过以上知识点的学习,我们可以更好地理解和掌握MySQL中获取...
在大数据量和高并发的环境下,数据库优化是保证系统性能和稳定性的重要环节。本文主要讨论了数据库结构设计和查询优化两个关键方面。 首先,数据库结构的设计至关重要。一个合理的数据库模型不仅可以简化客户端和...
然而,这种机制在分布式系统或高并发环境下可能无法满足需求,因为单个数据库实例可能无法处理所有的请求。 Java中的快速ID自增器通常是通过以下几种方式实现的: 1. **原子类**:Java的`AtomicLong`类是线程安全...
这在多用户环境下尤其有用,确保即使在高并发环境下也能正确地自增ID,避免了ID冲突。 创建序列的基本语法如下: ```sql CREATE SEQUENCE sequence_name START WITH start_value INCREMENT BY increment_value ...