JDBC Batch Updates(二)(jdbc底层的操作)
sinye56 2024-10-20 13:21 4 浏览 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 语句缓存。
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)