JDBC Batch Updates(二) jdbc批量更新三种模式
yuyutoo 2024-10-28 20:21 1 浏览 0 评论
最近在看一本书《high performance java persistence》,做一下笔记
这章不会太长,也是拓展一下大家的知识。
java.sql.Statement: 执行SQL语句并获取执行结果集,记住喔,这个接口的实现类执行的静态SQL语句喔。
java.sql.PreparedStatement:如果你翻开JDK,里面指的是一个预编译的SQL语句,文绉绉的,其实就是动态传参的SQL语句。
java.sql.CallableStatement:执行存储过程的接口。
Batch updates,中文译过来就是批量更新。我们平时都是用框架去做这些东西,却对底层了解的很少,下面我就和大家介绍一下。
JDBC2.0引入指量更新。这里于多条的DML statements(DML 语句)可以组合在一个请求里面发送给数据库。
看一段代码:
statement.addBatch(
"INSERT INTO post (title, version, id) " + "VALUES ('Post no. 1', 0, 1)");
statement.addBatch(
"INSERT INTO post_comment (post_id, review, version, id) " + "VALUES (1, 'Post comment 1.1', 0, 1)");
int[] updateCounts = statement.executeBatch();
这里就要敲黑板了,是扩充你的知识面的时候。不同的数据库厂商实现的会有所差异的,下面我是根据书还有一些文章来给你解释一下:
首先是Oracle,对于Statement和CallableStatement,其实是没并没有真正的像我上面说的合成一个请求,其实是每一条语句独立执行并没有批量执行,所以性能上面并没有提升的。PrepareStatment是有能进行批量处理的,但是那个batch size你要注意了,官方提出是50-100最佳。原因就是如果批次太大会造成占用太大的内存,通常会导致系统性能下降。
书中原文:
Oracle
For Statement and CallableStatement, the Oracle JDBC Driver doesn’t actually support batching For anything but PreparedStatement, the driver ignores batching, and each statement is executed separately.
然后我又去了官方文档找了一下:http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraperf.htm#JJDBC28752
文档提及
The Oracle implementation of standard update batching does not implement true batching for generic statements and callable statements. Even though Oracle JDBC supports the use of standard batching for Statement and CallableStatement objects, you are unlikely to see performance improvement.
因为我说的不一定正确,书中也不一定正确,所以官方文档是最靠谱的。下面我解析其他数据库厂商的实现再不会贴英文了,但是我会将官方文档贴链接贴着,方便你去查证。
对于Mysql:
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html
Mysql默认是没有将多条语句合成一个batch发送给数据库。但是为了达到batch,驱动提供了一个属性rewriteBatchedStatements,当设置为true的时候,你的批处理才会生效,不然你用框架傻傻的写代码,然后会发现怎么性能没上来,换个框架还是没有上来。其实在你jdbc.url拼接的时候加上rewriteBatchedStatements=true就大大的提升了性能了。我就在网上随便找一条sample
master.jdbc.url=jdbc:mysql://112.126.84.3:3306/platform?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
但是这个参数也会带来一定副作用。但是根据官文我也不是很了解是什么意思,如果你知道,评论区留言一下让我知道。
Bulk Operations的操作性能会比batch update好,但是灵活性不如batch update.工作当中我也没涉及到这一块。
主键的生成通常都交给数据库,但是如果获取回生成的主键呢。
通过PrepareStatment有三种方式:
第一种:
PreparedStatement postStatement = connection.prepareStatement(
"INSERT INTO post (title, version) VALUES (?, ?)",
Statement.RETURN_GENERATED_KEYS
);
第二种:
PreparedStatement postStatement = connection.prepareStatement(
"INSERT INTO post (title, version) VALUES (?, ?)",
new int[] {1}
);
第三种:
PreparedStatement postStatement = connection.prepareStatement(
"INSERT INTO post (title, version) VALUES (?, ?)",
new String[] {"id"}
);
根据JDBC4.2的规范,每个driver都必须实现supportsGetGeneratedKeys()来说明是否支持获取主键。是不是觉得很有意思。平时写代码的时候根本没有注意这一块。但是这个对于Statment是强制性要求的,但是对于PrepareStatment是没有要求的。下图算是拓展知识吧。
序列,有一些数据库提供序列就是sequence来将主键的生成和数据插入进行分离。
下面是几种数据分别创表和获取序列的语法
创表:
#Oracle 12c 之前的创建表
CREATE SEQUENCE post_seq;
CREATE TABLE post (
id NUMBER(19,0) NOT NULL, title VARCHAR2(255 CHAR), version NUMBER(10,0) NOT NULL, PRIMARY KEY (id));
CREATE OR REPLACE TRIGGER post_identity BEFORE INSERT ON post
FOR EACH ROW
BEGIN
SELECT post_seq.NEXTVAL INTO :NEW.id
FROM dual;
end;
#Oracle 12c 之后
CREATE TABLE post (
id NUMBER(19,0) NOT NULL GENERATED ALWAYS AS IDENTITY, title VARCHAR2(255 CHAR),
version NUMBER(10,0) NOT NULL,
PRIMARY KEY (id));
SQL Server
CREATE TABLE post (
id BIGINT IDENTITY NOT NULL,
title VARCHAR(255),
version INT NOT NULL,
PRIMARY KEY (id));
PostgreSQL 9.5
CREATE TABLE post (
id SERIAL NOT NULL,
title VARCHAR(255),
version INT4 NOT NULL,
PRIMARY KEY (id)
);
#另外一种创表
CREATE TABLE post (
id INTEGER DEFAULT NEXTVAL('post_id_seq') NOT NULL, title VARCHAR(255),
version INT4 NOT NULL,
PRIMARY KEY (id));
);
MysSQL 5.7
CREATE TABLE post (
id BIGINT NOT NULL AUTO_INCREMENT,
title VARCHAR(255),
version INTEGER NOT NULL,
PRIMARY KEY (id));
获取序列:
#Oracle
SELECT post_seq.NEXTVAL FROM dual;
#SQL Server
SELECT NEXT VALUE FOR post_seq;
#PostgreSQL
SELECT NEXTVAL('post_seq');
可以看到PostgresSQL使用SERIAL,底层还是用序列实现。
下一篇我会聊一下Statement Caching 语句缓存。
相关推荐
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
-
前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写...
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
-
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。第二步,创建多语言目录。相关推荐:《ThinkPHP教程》第三步,编写语言包。视图代码:控制器代码:效果如下:以上就是thi...
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
-
FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。主要特性基于Auth验证的权限管理系统支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置支持单...
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
-
本文实例讲述了Thinkphp5.0框架实现控制器向视图view赋值及视图view取值操作。分享给大家供大家参考,具体如下:Thinkphp5.0控制器向视图view的赋值方式一(使用fetch()方...
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
-
由于之前写评论回复都是使用第三方插件:畅言所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...
- ThinkPHP框架——实现定时任务,定时更新、清理数据
-
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用到一个名为E...
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
-
BeyongCms内容管理系统(简称BeyongCms)BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统,适用于企业Cms,个人站长等,针对移动App、小程序优化;提供完善简...
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
-
介绍YimaoAdminv3.0.0企业建站系统,使用thinkphp5.1.27+mysql开发。php要求5.6以上版本,推荐使用5.6,7.0,7.1,扩展(curl,...
- ThinkAdmin-V5开发笔记(thinkpad做开发)
-
前言为了快速开发一款小程序管理后台,在众多的php开源后台中,最终选择了基于thinkphp5的,轻量级的thinkadmin系统,进行二次开发。该系统支持php7。文档地址ThinkAdmin-V5...
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
-
复现先搭建thinkphp5.0.9环境...
- thinkphp5出现500错误怎么办(thinkphp页面错误)
-
thinkphp5出现500错误,如下图所示:相关推荐:《ThinkPHP教程》require():open_basedirrestrictionineffect.File(/home/ww...
- Thinkphp5.0极速搭建restful风格接口层
-
下面是基于ThinkPHPV5.0RC4框架,以restful风格完成的新闻查询(get)、新闻增加(post)、新闻修改(put)、新闻删除(delete)等server接口层。1、下载Thin...
- 基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP
-
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机...
- ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法
-
漏洞描述由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。漏洞评级严重影响版本ThinkPHP5.0系列...
- Thinkphp5代码执行学习(thinkphp 教程)
-
Thinkphp5代码执行学习缓存类RCE版本5.0.0<=ThinkPHP5<=5.0.10Tp框架搭建环境搭建测试payload...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
- ThinkPHP框架——实现定时任务,定时更新、清理数据
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
- ThinkAdmin-V5开发笔记(thinkpad做开发)
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)