zoukankan      html  css  js  c++  java
  • 面试-数据库

    1. JDBC访问数据库的基本步骤是什么?

    //1.注册驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //2.获取连接
    Connection conn = DriverManager.getConnection("jdcc:oracle:thin:@localhost:1506:Alfred","root","root");
    //3.获取能够发送sql语句的对象
    Statement st = conn.createStatement();
    //4.执行sql语句
    ResultSet rs = st.executeQuery(sql);
    //5.有结果集处理结果集
    while(rs.next){
    System.out.println(rs.getInt("id")+"  "+rs.getName("name"));
    }
    //6.关闭资源
    if(rs!=null){
    rs.close();
    }
    if(st!=null){
    st.close();
    }
    if(conn!=null){
    conn.close();
    }

    2.  说说preparedStatement和Statement的区别

    关系:PreparedStatement继承自Statement,都是接口
    区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高

    3.  数据库连接池的原理。为什么要使用连接池。

    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。
    但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。 连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

    4.  说说事务的概念,在JDBC编程中处理事务的步骤。

    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 
    事务的四大特性(ACID)
    ⑴ 原子性(Atomicity)
      原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
    
    ⑵ 一致性(Consistency)
      一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
    
      拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
    
    ⑶ 隔离性(Isolation)
      隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    
      即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
    
      关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
    
    ⑷ 持久性(Durability)
      持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    过程:
    1. 在jdbc中,默认事务是自动提交的,
    如果要手动控制事务,我们必须把jdbc自动提交事务关闭:  conn.setAutoCommit(false); 

      2. 手动提交事务:  conn.commit();  

      3. 在异常处理中回滚整个事务

    5.  事务隔离级别,JDBC的脏读、幻读、不可重复读是什么? 哪种数据库隔离级别能防止脏读、幻读、不可重复读?

    
    

    数据库隔离级别:是在在数据库操作中,为了有效保证并发读取数据的正确性提出的。

    
    

          隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

    
    

          数据库的几种隔离级别:

    
    
    •       READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和幻读问题。
    •       READ COMMITTED(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。
    •       REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
    •       SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,但性能非常低。
    
    

          Oracle支持两种事务隔离级别

          READ COMMITTED(默认事务隔离级别),SERIALIZABLE

          MySQL支持四种事务隔离级别,其中REPEATABLE READ为默认事务隔离级别

    
    

          通过上面可以知道多事务同时运行,如果不采用以上四种隔离机制,可能会产生多个并发问题,其中包括脏读、不可重复读和幻读,下面就解释下这几种并发问题:

    
    

          存在两个事物(T1,T2)同时运行

    •       脏读:T1读取了已经被T2修改但还未提交的字段,由于某种原因,T2事物回滚,则T1读取的内容是临时且无效的。
    •       不可重复读:T1读取一个字段,之后T2更新了该字段,T1在此读取该字段值发生了变化。
    •       幻读:T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后T1在此读取该表会多出几行。

          数据库事务的特性:原子性、一致性、隔离性、持久性

    •       原子性:事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行,这种特性称为原子性。(简单地说就是,几个对于数据库的操作要么全执行,要么全不执行,即同时成功起作用或同时失败没影响)
    •       一致性:事务一致性值得是在一个事务执行之前和执行之后数据库都必须处于一致性状态(中途是否一致不用管),这种特性称为一致性。(如果数据库的状态满足所有的完整性约束,就说该数据库是一致的。一致性处理数据库中对所有语义的保护。如:客户K1要向客户K2转账,K1账户减少的金额就是K2账户增加的金额,在转账之前K1和K2账户的金额之和与转账之后K1和K2账户的金额之和是一样的,在转账期间可能不满足这种一致性,但事务前后是数据库数据是一致的)
    •       隔离性:隔离性指的是并发的事务是相互隔离的。(一个事务内部的操作及正在操作的数据必须封装起来,不被其它企图进行修改的事务看到)
    •       持久性:持久性指当系统或介质发生故障时,确保已提交的更新不能丢失。(一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,可以经受任何系统故障,持久性通过数据库备份和恢复来保证)

    6.  JDBC的DriverManager是用来做什么的?

    // 获取连接Connection            主机:端口号/数据库名
    Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cw","root","root");

    7.  SQL分页

    mysql:   //初始记录行的偏移量是 0(而不是 1):
    SELECT * FROM table LIMIT 5,3; //检索记录行6-8 ,共3条
    
    oracle:
    SELECT * FROM Persons WHERE ROWNUM <= 5
    
    sql server:
    SELECT TOP 2 * FROM Persons
  • 相关阅读:
    Pytorch-实战之对Himmelblau函数的优化
    Pytorch-tensor的感知机,链式法则
    Pytorch-tensor的激活函数
    Pytorch-tensor的分割,属性统计
    Pytorch-tensor的转置,运算
    Pytorch-tensor维度的扩展,挤压,扩张
    Transformer代码细节
    Leetcode 1494
    格雷码
    两个正序数组的中位数
  • 原文地址:https://www.cnblogs.com/lovedaodao/p/10113557.html
Copyright © 2011-2022 走看看