JDBC面试题(2)

2018-12-04 17:17

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一个最大的好处是它可以是离线的,这样使得它更轻量级,同时便于在网络间进行传输。

具体使用哪个取决于你的需求,不过如果你操作ResultSet对象的时间较长的话,最好选择一个离线的RowSet,这样可以释放数据库连接。

24.常见的JDBC异常有哪些?

有以下这些:

java.sql.SQLException——这是JDBC异常的基类。

java.sql.BatchUpdateException——当批处理操作执行失败的时候可能会抛出这个异常。这取决于具体的JDBC驱动的实现,它也可能直接抛出基类异常java.sql.SQLException。 java.sql.SQLWarning——SQL操作出现的警告信息。

java.sql.DataTruncation——字段值由于某些非正常原因被截断了(不是因为超过对应字段类型的长度限制)。

25.JDBC里的CLOB和BLOB数据类型分别代表什么?

CLOB意思是Character Large OBjects,字符大对象,它是由单字节字符组成的字符串数据,有自己专门的代码页。这种数据类型适用于存储超长的文本信息,那些可能会超出标准的VARCHAR数据类型长度限制(上限是32KB)的文本。

BLOB是Binary LargetOBject,它是二进制大对象,由二进制数据组成,没有专门的代码页。它能用于存储超过VARBINARY限制(32KB)的二进制数据。这种数据类型适合存储图片,声音,图形,或者其它业务程序特定的数据。

26.JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的。

数据库的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔离级别可以防止脏读。

27.什么是两阶段提交?

当我们在分布式系统上同时使用多个数据库时,这时候我们就需要用到两阶段提交协议。两阶段提交协议能保证是分布式系统提交的原子性。在第一个阶段,事务管理器发所有的事务参与者发送提交的请求。如果所有的参与者都返回OK,它会向参与者正式提交该事务。如果有任何一个参与方返回了中止消息,事务管理器会回滚所有的修改动作。

28.JDBC中存在哪些不同类型的锁?

从广义上讲,有两种锁机制来防止多个用户同时操作引起的数据损坏。

乐观锁——只有当更新数据的时候才会锁定记录。 悲观锁——从查询到更新和提交整个过程都会对数据记录进行加锁。

不仅如此,一些数据库系统还提供了行锁,表锁等锁机制。

29.DDL和DML语句分别代表什么?

DDL(数据定义语言,Data Definition Language)语句用来定义数据库模式。Create,Alter, Drop, Truncate, Rename都属于DDL语句,一般来说,它们是不返回结果的。 DML(数据操作语言,Data Manipulation Language)语句用来操作数据库中的数据。select, insert, update, delete, call等,都属于DML语句。

30.java.util.Date和java.sql.Date有什么区别?

java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如果你想把时间信息存储在数据库里,可以考虑使用Timestamp或者DateTime字段。

31.如何把图片或者原始数据插入到数据库中?

可以使用BLOB类型将图片或者原始的二进制数据存储到数据库里。

32.什么是幻读,哪种隔离级别可以防止幻读?

幻读是指一个事务多次执行一条查询返回的却是不同的值。假设一个事务正根据某个条件进行数据查询,然后另一个事务插入了一行满足这个查询条件的数据。之后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫做幻读。只有TRANSACTION_SERIALIZABLE隔离级别才能防止产生幻读。

33.SQLWarning是什么,在程序中如何获取SQLWarning?

SQLWarning是SQLException的子类,通过Connection, Statement, Result的getWarnings方法都可以获取到它。 SQLWarning不会中断查询语句的执行,只是用来提示用户存在相关的警告信息。

34.如果Oracle的存储过程的入参出参中包含数据库对象,应该如何进行调用?

如果Oracle的存储过程的入参出参中包含数据库对象,我们需要在程序创建一个同样大小的对象数组,然后用它来生成Oracle的STRUCT对象。然后可以通过数据库对象的


JDBC面试题(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:海南省琼海市嘉积中学2017届高三下学期第一次月考数学(理)试题含

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: