10个问题让你快速避开java中的jdbc常见坑
摘要:JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。
本文分享自华为云社区《10个问题让你快速避开java中的jdbc常见坑》,作者: breakDraw。
Connection.setAutoCommit(boolean)
用于事务提交。
setAutoCommit(true), 则执行的所有sql执行都会作为单个事务直接提交并运行
setAutoCommit(false), 则必须等调用conn.commit()才会提交运行
Q: setAutoCommit默认是true还是false
A: 默认是true。
Q: setAutoCommit(true)的缺点是什么?
A: 如果一次性执行多个sql语句, 中间sql出错时,就会造成脏数据。
Q: setAutoCommit(false)后,如果出了错却没有在catch中进行Connection的rollBack操作,会发生什么?
A; 操作的表就会被锁住,造成数据库死锁
fetchSize
fetchSize 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数
- fetchSize越 大, 客户端内存占用越 大,读取数据库次数越 少,速度越 快。
Q: Oracle和Mysql中的fetchSize有什么区别?
A: Oracle会每次网络传输fetchSize条数据到客户端, MYSQL则会一次性全部传送到客户端,因此Mysql中的fetchSize是一种模拟游标。
PreparedStatement
Q:相比Statement的好处?
A:
- PreparedStatement是预编译的,比Statement速度快,执行效率高,因此即使sql中不带参数也最好使用PreparedStatement
- 代码的可读性和可维护性更好(相比于sql拼接)
- PreparedStatement可以防止SQL注入攻击,而Statement却不能
Q:prepareStatement是statement接口的实现吗?
A:prepareStatement不是实现,而是继承的接口
CallableStatement
- CallableStatement继承自PreparedStatement
- CallableStatement接口添加了 调用存储过程 核函数以及处理输出参数(INOUT)的方法。
- 即存储过程就用CallableStatement
Connection Pool
连接池优点:
- 减少连接创建次数
- 更快的系统整体响应速度
- 统一连接管理,减少失误性的连接未关闭。
ResultSet
作用: 缓存数据结果集
Statement st = conn. createStatement (int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)
滚动,就是指调用.next()或者.previous()或者移动到对应行
resultSetType 是设置 ResultSet 对象的类型可滚动,或者是不可滚动。取值如下(见单词知意):
- ResultSet.TYPE_FORWARD_ONLY 只能向前滚动
- ResultSet.TYPE_SCROLL_INSENSITIVE, 支持前后滚动,对修改不敏感
- ResultSet.TYPE_SCROLL_SENSITIVE 支持前后滚动,对修改敏感
resultSetConcurency 是设置 ResultSet 对象能够修改的,取值如下:
- ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。
- ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。
Q:Connection、statement、ResultSet的关闭顺序是?
A:先ResultSet、再Statement、最后再connection。
因为这种操作很麻烦,最好使用jdbc连接池,或者try-with-resource
数据库知识
Q:事务的ACID属性是什么?
A:
- A是 atomicity原子性, 事务内的行为一次性执行完,要么就回退
- C是consistency一致性 有a+b=c的限制条件,然后a变化的同时,b也必须跟着变化
- I是isolation隔离性 事务隔离,即事务的中间执行过程,对另外一个事务不可见。
- D是durability持久性 提交i成功后,修改不会改变,也会被记录。
Q: 脏读、不可重复读和幻读是什么?
A:
- 脏读:数据被更新了,但是还没提交, 然后另一个事务读到了更新后的数据,结果事务回滚了,导致读的数据其实是脏数据,
- 不可重复读: 1个事务要读2次数据(注意是单条数据),结果第一次读和第二次读数据不一致了。
- 幻读: 1个事务读了2次 数据,发现2次的记录数不一致(注意事项记录数)
10个问题让你快速避开java中的jdbc常见坑的更多相关文章
- JAVA中enum的常见用法
JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...
- 第67节:Java中的JDBC运用
第67节:Java中的JDBC运用 https://www.jianshu.com/p/628a9ba1b205
- Java中9种常见的CMS GC问题分析与解决
1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...
- java中使用jdbc配置连接串时mysql 5.6与5.7版本“编码”参数有区别!
在mysql5.6中 java程序使用jdbc时链接字符串应该使用?characterEncoding=utf-8,而5.7版本可以省略,否则可能会有相关的语句执行结果出错! String drive ...
- Java中的JDBC是什么?
JDBC(Java Data Base Connectivity, Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它有一组用Java语言编写的类和接 ...
- java中的JDBC
Java 是通过 JDBC 技术实现对各种数据库访问的,换句话说,JDBC 充当了 Java 应用程 序与各种不同数据库之间进行对话的媒介. JDBC 是 Java 数据库连接(Java DataBa ...
- Java中避免空指针常见的方法
什么是空指针? 当一个变量的值为null时,在Java里表示一个不存在的空对象,没有实际内容,没有给它分配内存,null也是对象成员的默认值.所以,一个对象如果没有进行初始化操作,这时如果调用这个对象 ...
- Java中枚举的常见用法
在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...
- 快速掌握Java中Lambda表达式的用法
Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...
- 【视频+图文】带你快速掌握Java中含break语句的双重for循环
双重for循环掌握后,我们就一起来看看双重for循环的进阶内容一之带break语句的双重for循环. 双重for循环[视频+图文]讲解传输门:点击这里可去小乔的哔哩哔哩观看~ 带continue语句的 ...
随机推荐
- 聊聊 RocketMQ 消息轨迹
这篇文章,我们聊一聊 RocketMQ 的消息轨迹设计思路. 查询消息轨迹可作为生产环境中排查问题强有力的数据支持 ,也是研发同学解决线上问题的重要武器之一. 1 基础概念 消息轨迹是指一条消息从生产 ...
- JUC并发编程学习笔记(七)常用的辅助类
常用的辅助类 CountDownLatch 这是一个JUC计数器辅助类,计数器有加有减,这是减. 使用方法 package org.example.demo; import java.util.con ...
- Hundred Finance 攻击事件分析
Hundred Finance 背景知识 Hundred Finance 是 fork Compound 的一个借贷项目,在2023/04/15遭受了黑客攻击.攻击者在发起攻击交易之前执行了两笔准备交 ...
- CF1592C. Bakry and Partitioning
原题链接:CF1592C. Bakry and Partitioning 题意: 给定一个\(n\)个点,\(n - 1\)条边的树,并且每个点都有权值\(w_i\),让你最少割掉一条边最多割掉\(k ...
- Codeforces Round #700 (Div. 2) A~C题解
写在前边 链接:Codeforces Round #699 (Div. 2) A. Yet Another String Game 链接:A题链接 题目大意: 给定一个字符串,有两位同学来操作这个字符 ...
- 大白话说Python+Flask入门(三)
写在前面 今天状态很不好,我发现学这部分知识的时候,会出现溜号或者注意力无法集中的情况. 我能想到的是,大概率是这部分知识,应该是超出了我现在的水平了,也就是说我存在知识断层了,整体感觉真的是一知半解 ...
- Windows文件句柄无效
今天我用FreeFileSync从移动硬盘复制一个名为Con的文件夹到本地硬盘,复制失败. 通过文件夹资源管理器Explorer直接访问文件夹则提示"禁止访问",右键属性切换到安全 ...
- keepass
- Kepware楼宇自控BACnet/IP驱动
BACnet/IP驱动是楼宇自动化设备驱动的集合,为用户提供一种方便快捷的楼宇自动化设备数采解决方案.只需要通过简单的配置就可以将常见的BACnet/IP协议设备无缝连接到 HMI/SCADA.MES ...
- style绑定及随机颜色
一个小案例 颜色变换 style单机事件的绑定