写点什么

10 个问题让你快速避开 java 中的 jdbc 常见坑

  • 2022 年 1 月 04 日
  • 本文字数:1530 字

    阅读完需:约 5 分钟

摘要: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:

1.     PreparedStatement 是预编译的,比 Statement 速度快,执行效率高,因此即使 sql 中不带参数也最好使用 PreparedStatement

2.     代码的可读性和可维护性更好(相比于 sql 拼接)

3.     PreparedStatement 可以防止 SQL 注入攻击,而 Statement 却不能


    Q:prepareStatement 是 statement 接口的实现吗?

    A:prepareStatement 不是实现,而是继承的接口



    CallableStatement


    • CallableStatement 继承自 PreparedStatement

    • CallableStatement 接口添加了调用存储过程核函数以及处理输出参数(INOUT)的方法。

    • 即存储过程就用 CallableStatement

    Connection Pool


    连接池优点:

    1.     减少连接创建次数

    2.     更快的系统整体响应速度

    3.     统一连接管理,减少失误性的连接未关闭。

    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 次的记录数不一致(注意事项记录数)


    点击关注,第一时间了解华为云新鲜技术~

    发布于: 1 小时前
    用户头像

    提供全面深入的云计算技术干货 2020.07.14 加入

    华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

    评论

    发布
    暂无评论
    10个问题让你快速避开java中的jdbc常见坑