Connection.setAutoCommit(boolean)
用于事务提交。setAutoCommit(true)
, 则执行的所有sql执行都会作为单个事务直接提交并运行setAutoCommit(false)
, 则必须等调用conn.commit()
才会提交运行
Q:setAutoCommit
默认是true
还是false
Q:setAutoCommit(true)
的缺点是什么?
A:如果一次性执行多个sql语句, 中间sql出错时,就会造成脏数据。
Q:setAutoCommit(false)
后,如果出了错却没有在catch
中进行Connection
的rollBack
操作,会发生什么?
fetchSize
fetchSize
是设定JDBC的Statement
读取数据的时候每次从数据库中取出的记录条数
- fetchSize越 大, 客户端内存占用越 大,读取数据库次数越 少,速度越 快。
Q:Oracle和Mysql中的
A:Oracle会每次网络传输fetchSize
有什么区别?fetchSize
条数据到客户端, MYSQL则会一次性全部传送到客户端,因此Mysql中的fetchSize
是一种模拟游标。PreparedStatement
Q:相比
A:Statement
的好处?
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次的记录数不一致(注意事项记录数)