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 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 
  

posted @ 2019-04-18 22:38  Zuul  阅读(173)  评论(0编辑  收藏  举报