Spring中MySQL自增ID获取陷阱:DataSourceUtils与select_last_insert_id()
82 浏览量
更新于2024-09-04
收藏 106KB PDF 举报
在Spring框架中,当你从Oracle数据库切换到MySQL,并试图利用`select last_insert_id()`函数获取新插入记录的自增ID时,可能会遇到一些挑战。在Oracle中,由于使用序列预先获取自增ID并保存,这个过程在Spring JDBC中通常可以直接进行。然而,MySQL的`last_insert_id()`函数依赖于数据库连接,这意味着在Spring的上下文中,你需要正确地管理Connection。
Spring JDBC中的`DataSourceUtils.getConnection(getDataSource())`方法获取连接时,如果不显式地管理事务或手动设置连接属性,`last_insert_id()`可能不会返回预期的值,因为它主要用于自动提交事务的环境。Spring默认的行为是异步刷新连接池,可能导致你无法获取到最新的自增ID。
为了解决这个问题,你需要确保以下几点:
1. **手动管理事务**:在插入操作后立即手动提交事务,确保`last_insert_id()`能返回正确的ID。可以通过`connection.commit()`或`connection.setAutoCommit(true)`来实现。
2. **Spring配置调整**:如果你希望在非事务环境中也能获取自增ID,可以考虑配置Spring JDBC模板或者AOP(面向切面编程)来拦截插入操作,然后执行`last_insert_id()`查询。例如,使用`org.springframework.jdbc.core.JdbcTemplate#update`方法,设置`returnGeneratedKeys`参数为`true`,并在回调方法中获取`ResultSet`的`getGeneratedKeys()`。
3. **使用数据库特定工具**:如上文提到的《Spring应用数据主键的生成策略盘点》中所述,可以考虑使用带有缓存的`DataFieldMaxValueIncrementer`,它允许一次性获取多条记录的主键值,减少后续查询的开销,特别是在高并发场景下。
4. **ORM框架处理**:像Hibernate这样的ORM框架通常会在对象持久化后自动处理主键生成,你可以在保存对象后直接获取其主键值,无需额外查询。不过,如果使用的是Spring Data JPA或其他类似的框架,可能需要配置主键生成策略。
在Spring环境下使用MySQL的自增ID时,你需要理解并调整Spring对连接的管理和事务处理,确保在插入操作后能正确获取到`last_insert_id()`。同时,根据具体需求选择合适的主键生成策略,以优化性能和避免潜在的问题。
2020-12-16 上传
点击了解资源详情
892 浏览量
2392 浏览量
1795 浏览量
1330 浏览量
1318 浏览量
点击了解资源详情
点击了解资源详情
weixin_38725450
- 粉丝: 2
- 资源: 913
最新资源
- c#课程设计连接sqlserver数据库,笔记本,存储修改文字图片等.zip
- 厨师
- StatusNeo
- myportfolio:使用react制作的投资组合网站
- HW2
- 行业文档-设计装置-一种利用真空绝热板保温的墙体.zip
- rsvp:用于处理rsvp响应的节点服务器
- 《安全生产管理系统》适合各级安全生产监督管理部门和各企业进行安全管理,它为各企业的安全生产和消防安全提供规范化、透明.zip
- EvsSimpleGraph:此代码已移至 github https://github.com/taazz/EvsSimpleGr-开源
- covarr-de:协变量模型选择,微分和网络表达
- angular-redactor:angular-redactor,富文本编辑器redactor
- chat-room-network
- Rust-Raytracer
- plugin-redis
- ainsleighdouglas.github.io
- 基于深度学习的肿瘤辅助诊断系统,以图像分割为核心,利用人工智能完成肿瘤区域的识别勾画并提供肿瘤区域的特征来辅助医生进.zip