java面试题总结系列(JDBC)
说一下通过JDBC操作数据库的步骤
第一步:通过反射注册并加载驱动Driver,驱动类会自动注册到DriverManager类,并加载到内存中。
第二步:通过DriverManager类获取connection连接对象。
第三步:通过连接对象获取statement数据库操作对象。
第四步:通过statement执行sql语句,返回Resultset结果集。
第五步:处理结果(Resultset)。
第六步:释放资源(关闭连接,结果集,会话)。
说一下PreparedStatement和statement的区别
PreparedStatement是对sql进行预编译的,对于批量处理可以大大提高效率。
statement则需要对sql语句进行拼接。而PreparedStatement是当参数传入。
Statement 容易被 SQL 注入,而 PreparedStatement 传入的内容不会与sql语句发生任何匹配关系。
事务的四大特性
- 事务的原子性( Atomicity):一组事务,要么成功;要么撤回。
- 一致性 (Consistency):事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功否,参与转账的两个账号余额之和应该是不变的。
- 隔离性(Isolation):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
- 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务的并发问题
- 脏读:T1读取到T2未提交的更新数据,T2事务回滚,T1读取事务无效。
- 不可重复读:一个事务两次读同一行数据,两次查询数据不一致(改)。
- 幻读:一个事务执行了两次查询,但两次查询的数据行数不一致(增删)。
- 丢失更新:撤销事务时,把其他事务的更新覆盖了。
事务的隔离级别
(1)、SERIALIZABLE(串行化)
- 不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
- 性能最差
(2)、REPEATABLE READ(可重复读)(MySQL默认)
- 防止脏读和不可重复读,不能处理幻读
- 性能比SERIALIZABLE好
(3)、READ COMMITTED(读已提交数据)(Oracle默认)
- 防止脏读,不能处理不可重复读和幻读;
- 性能比不可重复读好
(4)、READ UNCOMMITTED(读未提交数据)
- 可能出现任何事物并发问题,什么都不处理。
- 性能最好,但不推荐使用。
DataSource和DriverManager的区别是什么?
DriverManager需要加载驱动,而DataSource是在JNDI中注册该数据源对象,无需加载驱动。
DriverManager不支持数据库连接池,而DataSource则支持数据库连接池。
常用的数据库连接池
C3P0,DBCP,Druid
数据库连接池运行机制
数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的访问数据库请求就可以共享这些连接。
J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。