JDBC面试题 下载本文

12.Statement中的setFetchSize和setMaxRows方法有什么用处?

setMaxRows可以用来限制返回的数据集的行数。当然通过SQL语句也可以实现这个功能。比如在MySQL中我们可以用LIMIT条件来设置返回结果的最大行数。

setFetchSize理解起来就有点费劲了,因为你得知道Statement和ResultSet是怎么工作的。当数据库在执行一条查询语句时,查询到的数据是在数据库的缓存中维护的。ResultSet其实引用的是数据库中缓存的结果。

假设我们有一条查询返回了100行数据,我们把fetchSize设置成了10,那么数据库驱动每次只会取10条数据,也就是说得取10次。当每条数据需要处理的时间比较长的时候并且返回数据又非常多的时候,这个可选的参数就变得非常有用了。我们可以通过Statement来设置fetchSize参数,不过它会被ResultSet对象设置进来的值所覆盖掉。

13.如何使用JDBC接口来调用存储过程?

存储过程就是数据库编译好的一组SQL语句,可以通过JDBC接口来进行调用。我们可以通过JDBC的CallableStatement接口来在数据库中执行存储过程。初始化CallableStatement的语法是这样的:

CallableStatementstmt = con.prepareCall(\stmt.setInt(1, id);

stmt.setString(2, name); stmt.setString(3, role); stmt.setString(4, city); stmt.setString(5, country);

//register the OUT parameter before calling the stored procedure stmt.registerOutParameter(6, java.sql.Types.VARCHAR); stmt.executeUpdate();

我们得在执行CallableStatement之前注册OUT参数。关于这个更详细的资料可以看这里。

13.JDBC的批处理是什么,有什么好处?

有时候类似的查询我们需要执行很多遍,比如从CSV文件中加载数据到关系型数据库的表里。我们也知道,执行查询可以用Statement或者PreparedStatement。除此之外,JDBC还提供了批处理的特性,有了它,我们可以在一次数据库调用中执行多条查询语句。JDBC通过Statement和PreparedStatement中的addBatch和executeBatch方法来支持批处理。批处理比一条条语句执行的速度要快得多,因为它需要很少的数据库调用,想进一步了解请点这里。

14.JDBC的事务管理是什么,为什么需要它?

默认情况下,我们创建的数据库连接,是工作在自动提交的模式下的。这意味着只要我们执行完一条查询语句,就会自动进行提交。因此我们的每条查询,实际上都是一个事务,如果我们执行的是DML或者DDL,每条语句完成的时候,数据库就已经完成修改了。

有的时候我们希望由一组SQL查询组成一个事务,如果它们都执行OK我们再进行提交,如果中途出现异常了,我们可以进行回滚。

JDBC接口提供了一个setAutoCommit(boolean flag)方法,我们可以用它来关闭连接自动提交的特性。我们应该在需要手动提交时才关闭这个特性,不然的话事务不会自动提交,每次都得手动提交。数据库通过表锁来管理事务,这个操作非常消耗资源。因此我们应当完成操作后尽快的提交事务。在这里有更多关于事务的示例程序。

15.如何回滚事务?

通过Connection对象的rollback方法可以回滚事务。它会回滚这次事务中的所有修改操作,并释放当前连接所持有的数据库锁。

16.JDBC的保存点(Savepoint)是什么,如何使用?

有时候事务包含了一组语句,而我们希望回滚到这个事务的某个特定的点。JDBC的保存点可以用来生成事务的一个检查点,使得事务可以回滚到这个检查点。 一旦事务提交或者回滚了,它生成的任何保存点都会自动释放并失效。回滚事务到某个特定的保存点后,这个保存点后所有其它的保存点会自动释放并且失效。可以读下这个了解更多关于JDBC Savepoint的信息。

17.JDBC的DataSource是什么,有什么好处?

DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性: 1.缓存PreparedStatement以便更快的执行 2.可以设置连接超时时间 3.提供日志记录的功能

4.ResultSet大小的最大阈值设置

通过JNDI的支持,可以为servlet容器提供连接池的功能

18.如何通过JDBC的DataSource和Apache Tomcat的JNDI来创建连接池?

对部署在servlet容器中的WEB程序而言,创建数据库连接池非常简单,仅需要以下几步。 在容器的配置文件中创建JDBC的JNDI资源,通常在server.xml或者context.xml里面。像这样:

type=\

driverClassName=%url=%username=\password=\maxActive=\maxIdle=\minIdle=\

maxWait=\

type=\

在WEB应用程序中,先用InitialContext来查找JNDI资源,然后获取连接。 Context ctx = new InitialContext();

DataSource ds = (DataSource) ctx.lookup(\

19.Apache的DBCP是什么?

如果用DataSource来获取连接的话,通常获取连接的代码和驱动特定的DataSource是紧耦合的。另外,除了选择DataSource的实现类,剩下的代码基本都是一样的。

Apache的DBCP就是用来解决这些问题的,它提供的DataSource实现成为了应用程序和不同JDBC驱动间的一个抽象层。Apache的DBCP库依赖commons-pool库,所以要确保它们都在部署路径下。

20.什么是数据库的隔离级别?

当我们为了数据的一致性使用事务时,数据库系统用锁来防止别人访问事务中用到的数据。数据库通过锁来防止脏读,不可重复读(Non-Repeatable Reads)及幻读(Phantom-Read)的问题。

数据库使用JDBC设置的隔离级别来决定它使用何种锁机制,我们可以通过Connection的getTransactionIsolation和setTransactionIsolation方法来获取和设置数据库的隔离

级别。

隔离级别 事务 脏读 不可重复读 幻读

TRANSACTION_NONE 不支持 不可用 不可用 不可用

TRANSACTION_READ_COMMITTED 支持 阻止 允许 允许 TRANSACTION_READ_UNCOMMITTED 支持 允许 允许 允许 TRANSACTION_REPEATABLE_READ 支持 阻止 阻止 允许 TRANSACTION_SERIALIZABLE 支持 阻止 阻止 阻止

21.JDBC的RowSet是什么,有哪些不同的RowSet?

RowSet用于存储查询的数据结果,和ResultSet相比,它更具灵活性。RowSet继承自ResultSet,因此ResultSet能干的,它们也能,而ResultSet做不到的,它们还是可以。RowSet接口定义在javax.sql包里。

22.RowSet提供的额外的特性有:

提供了Java Bean的功能,可以通过settter和getter方法来设置和获取属性。RowSet使用了JavaBean的事件驱动模型,它可以给注册的组件发送事件通知,比如游标的移动,行的增删改,以及RowSet内容的修改等。

RowSet对象默认是可滚动,可更新的,因此如果数据库系统不支持ResultSet实现类似的功能,可以使用RowSet来实现。 RowSet分为两大类:

A. 连接型RowSet——这类对象与数据库进行连接,和ResultSet很类似。JDBC接口只提供了一种连接型RowSet,javax.sql.rowset.JdbcRowSet,它的标准实现是com.sun.rowset.JdbcRowSetImpl。 B. 离线型RowSet——这类对象不需要和数据库进行连接,因此它们更轻量级,更容易序列化。它们适用于在网络间传递数据。有四种不同的离线型RowSet的实现。

CachedRowSet——可以通过他们获取连接,执行查询并读取ResultSet的数据到RowSet里。我们可以在离线时对数据进行维护和更新,然后重新连接到数据库里,并回写改动的数据。 WebRowSet继承自CachedRowSet——他可以读写XML文档。

JoinRowSet继承自WebRowSet——它不用连接数据库就可以执行SQL的join操作。 FilteredRowSet继承自WebRowSet——我们可以用它来设置过滤规则,这样只有选中的数据才可见。

23.RowSet和ResultSet的区别是什么?

RowSet继承自ResultSet,因此它有ResultSet的全部功能,同时它自己添加了些额外的特性。RowSet一个最大的好处是它可以是离线的,这样使得它更轻量级,同时便于在网络间进行传输。