刚从阿里巴巴面试出来被问到的10道面试题

1.你在项目中哪些地方用到了XML?

XML的主要作用有两个方面:数据交换和信息配置 在做数据交换时,XML将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从XML文件中还原相关信息进行处理,XML曾经hi异构系统间交换数据的事实标准,但此项功能几乎已经被JSON 取而代之,当然 目前很多软件仍然使用 XML来存储配置信息 我们在很多项目中通常也会作为配置信息的硬代码卸载XML文件中Java的很多框架也是这么做的 而且这些框架都选择了dom4J作为处理XML的工具 因为sun公司的官方API实在不怎么好用

2.阐述JDBC操作数据库的步骤

下面的代码以连接本机的Oracle数据库为例 演示JDBC操作数据库的步骤

加载驱动

Class.forName("oracle.jdbc.driver.OracleDriver");

创建链接

Connection con=DiverManager.getConnection("jdbc:oralce:thin:@locahost:1521:orcl","scott","tiger");

创建语句

PrepareStatement ps=con.prepareStatement("select * from emp where sal between ? and ?");

ps.setInt(1,1000);

ps.setInt(2,3000);

执行语句

ResultSet rs=ps.executeQuery();

hile(rs.next()) {
        System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
    }

    关闭资源。

  finally {
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

提示:关闭外部资源的顺序应该和打开的顺序相反,也就是说先关闭ResultSet ,再关闭Statement 在关闭 Connection 上面的代码只关闭了 Conneciton 虽然通常情况下载关闭链接时,链接上创建的语句和打开的游标也会关闭,但不能保证总是如此,因此应该按照刚才说的顺序分别关闭,此外,第一步加载驱动在JDBC 4.0中式可以省略的(自动从类路径中加载驱动)但是我们建议保留

3.statement 和PreparedStatement有什么区别?哪个性能更好?

与Statement相比 PrepareStatement接口代表预编译的语句 它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性) 2.PreparedStatement中的SQL语句是可以带参数的 避免了用字符串连接拼接SQL语句的麻烦和不安全 3.当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同的结构的语句时,就会很快(不用再次编译和生成执行计划)

为了提供对存储过程的调用 JDBC APC中还提供了 CallabelSatement接口 存储过程Stored Procedure是数据库中一组为了完成特定功能的SQL语句的集合 经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过 程带有参数)来执行它。虽然调用存储过程会在网络开销、安全性、性能上获得很多好处,但是存在如果底层数据库发生迁移时就会有很多麻烦,因为每种数据库的 存储过程在书写上存在不少的差别。


4.使用JDBC操作数据库时,如何提升读取数据的性能,如何提升更新数据的性能?

要提升读取数据的性能,可以指定通过结果集 Resulet 对象的setFetchSize()方法指定每次抓取的记录数 要提升更新数据的性能可以使用PreparedStatement语句构建批处理 将诺干SQL语句置于一个批处理中执行

5.在进行数据库编程时,连接池有什么作用?

由于创建链接和释放链接都有很大的开销 尤其是数据库服务器不在本地时,每次建立链接都需要进行TCP的三次握手,释放链接需要进行TCP四次握手,造成的开销是不可忽视的, 为了提升系统访问数据库的性能,可以事先创建若干链接置于链接池中需要时直接从连接池获取 使用结束时归还连接池而不必关闭连接 从而避免频繁创建和释放链接所造成的开销 这是典型的用空间换时间的策略,两份了空间存储链接但节省了创建和释放链接的时间,池化技术在Java开发中很常见的,在使用线程时创建线程池的道理与此相同 基于Java的开源数据库连接池主要有 C3P0 Proxool DBCP BoneCP Druid等

补充 在计算机系统中时间和空间是不可调和的矛盾 理解这一点对设计满足性能要求的算法时至关重要的,大型网站性能优化的一关键的就是使用缓存,而缓存跟上面将的链接池道理非常类似 也是使用空间换时间的测咯 可以将任店数据置于缓存中 当用户查询这些数据时可以直接从缓存中得到 这无论如何也阔过去数据库查询 当然 缓存的置换测咯等也会对系统性能产生重要影响 对于这个问题的讨论已经超出了这要阐述的范围

6.什么事DAO模式?

DAO 顾名思义时一个为了数据或其他持久化机制提供了抽象接口的对象 在不保罗底层持久化方案实现细节的前提下提供了各种数据访问操作 在实际的开发中 应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中 用程序设计语言来说就是建立一个接口接口中定义了此应用程序中将会用到的所有事物方法 在这个应用程序中 当需要和数据源进行交互的时候则使用这个接口 并且编写一个单独的类来实现这个接口 在逻辑上该类对应一个特定的数据存储 DAO模式实际上包含了连个模式 一个 Data Accessor 数据访问其 而是 Data Object 数据对象 前者要解决如何访问数据的问题 而后者要解决的是如何用对象封装数据

7.事物的ACID是指什么?

原子性 Atomic 事物中各项操作 要么全做要么全不做 任何一项操作的失败都会导致整个事物的失败,

一致性Consistent 事物结束后系统状态是一致的

隔离性 Isolated :并发执行的事物彼此无法看到对方的中间状态

持久性Durable 事物完成后所做的改动都会被持久化 即使发生灾难性的失败 通过日志和同步备份可以在故障发生后重建数据

关于事物 在面试中被问到的概率是很高的 可以问的问题也很多 首先需要知道的是 只要存在高并发数据访问时才需要事务 当多个事务访问同一数据时,可能会存在5类问题,包括3类数据读取问题 脏读 不可重复读 幻读 还有两类数据更新问题 第一类 丢失更新 和第二类丢失更新

脏读(Dirty Read):A事务读取B事物商未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据

不可重复读 Unrepeatable Read 事务A重新读取前面读取过的数据 发现该数据已经被另一个已提交的事务B修改过了

幻读 事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行

第1类丢失更新:事务A撤销时 把已经提交的事务B的更新数据覆盖了

第2类丢失更新:事务A覆盖事务B已经提交的数据 造成失误B所做的操作丢失

8.JDBC中如何进行事务处理?

Conneciton提供了事务处理的方法 通过调用setAutoCommit(false)可以设置手动提交事务,当事务完成后用commit()显式提交事务;如果在食物处理过程中发生异常则通过rollback()进行事务回滚。除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到指定的保存点。

9.JDBC能否处理Blob和Clob?

Blob是指二进制大对象 而Clob是指大字符对象 因此其中Blob是为了存储大的二进制数据而设计的 而Clob是为了存储大的文本数据而设计的 JDBC的PreparedStaement和ResultSet都提供了相应的方法来支持Blob和Clob操作

10.简述正则表达式及其用途

在编写处理字符串的程序时 经常会有查找符号某些复杂规则的字符串的需要 正则表达式就是用于描述这些规则的工具, 换句话说,正则表达式就是记录文本规则的代码

计算机诞生初期处理的信息几乎都是数值 但是时过境迁 今天我们使用计算机处理的信息更多的时候不是数值而是字符串 正则表达式就是在进行字符串匹配和处理的时候最为强大的工具 绝大数语言都提供了对正则表达式的支持

 

 

展开阅读全文

没有更多推荐了,返回首页