`
zengshaotao
  • 浏览: 787918 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jdbc常见面试经典

 
阅读更多

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

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

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

DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:

  • 缓存PreparedStatement以便更快的执行
  • 可以设置连接超时时间
  • 提供日志记录的功能
  • ResultSet大小的最大阈值设置
  • 通过JNDI的支持,可以为servlet容器提供连接池的功能


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

对部署在servlet容器中的WEB程序而言,创建数据库连接池非常简单,仅需要以下几步。 
在容器的配置文件中创建JDBC的JNDI资源,通常在server.xml或者context.xml里面
在WEB应用程序中,先用InitialContext来查找JNDI资源,然后获取连接。 

Java代码  收藏代码
  1. Context ctx = new InitialContext();  
  2. DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");  


Apache的DBCP是什么? 

如果用DataSource来获取连接的话,通常获取连接的代码和驱动特定的DataSource是紧耦合的。另外,除了选择DataSource的实现类,剩下的代码基本都是一样的。 
Apache的DBCP就是用来解决这些问题的,它提供的DataSource实现成为了应用程序和不同JDBC驱动间的一个抽象层。Apache的DBCP库依赖commons-pool库,所以要确保它们都在部署路径下。 

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

当我们为了数据的一致性使用事务时,数据库系统用锁来防止别人访问事务中用到的数据。数据库通过锁来防止脏读,不可重复读(Non-Repeatable Reads)及幻读(Phantom-Read)的问题。 
数据库使用JDBC设置的隔离级别来决定它使用何种锁机制,我们可以通过Connection的getTransactionIsolation和setTransactionIsolation方法来获取和设置数据库的隔离级别。 


隔离级别 事务 脏读 不可重复读 幻读
TRANSACTION_NONE 不支持             不可用             不可用 不可用
TRANSACTION_READ_COMMITTED 支持 阻止 允许 允许
       TRANSACTION_READ_UNCOMMITTED 支持 允许 允许 允许
        TRANSACTION_REPEATABLE_READ 支持 阻止 阻止 允许
        TRANSACTION_SERIALIZABLE 支持 阻止 阻止 阻止


         

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

RowSet用于存储查询的数据结果,和ResultSet相比,它更具灵活性。RowSet继承自ResultSet,因此ResultSet能干的,它们也能,而ResultSet做不到的,它们还是可以。RowSet接口定义在javax.sql包里。 
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——我们可以用它来设置过滤规则,这样只有选中的数据才可见。 


RowSet和ResultSet的区别是什么? 

RowSet继承自ResultSet,因此它有ResultSet的全部功能,同时它自己添加了些额外的特性。RowSet一个最大的好处是它可以是离线的,这样使得它更轻量级,同时便于在网络间进行传输。 
具体使用哪个取决于你的需求,不过如果你操作ResultSet对象的时间较长的话,最好选择一个离线的RowSet,这样可以释放数据库连接。 

常见的JDBC异常有哪些? 

有以下这些: 


java.sql.SQLException——这是JDBC异常的基类。 
java.sql.BatchUpdateException——当批处理操作执行失败的时候可能会抛出这个异常。这取决于具体的JDBC驱动的实现,它也可能直接抛出基类异常java.sql.SQLException。 
java.sql.SQLWarning——SQL操作出现的警告信息。 
java.sql.DataTruncation——字段值由于某些非正常原因被截断了(不是因为超过对应字段类型的长度限制)。 


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

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

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

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

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

什么是两阶段提交? 

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

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

从广义上讲,有两种锁机制来防止多个用户同时操作引起的数据损坏。 
乐观锁——只有当更新数据的时候才会锁定记录。 
悲观锁——从查询到更新和提交整个过程都会对数据记录进行加锁。 
不仅如此,一些数据库系统还提供了行锁,表锁等锁机制。 

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

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

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

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

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

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

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

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

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

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

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

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

如果java.sql.SQLException: No suitable driver found该怎么办? 

如果你的SQL URL串格式不正确的话,就会抛出这样的异常。不管是使用DriverManager还是JNDI数据源来创建连接都有可能抛出这种异常。它的异常栈看起来会像下面这样。 


Java代码  收藏代码
  1. org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL ''jdbc:mysql://localhost:3306/UserDB'  
  2.     at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)  
  3.     at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)  
  4.     at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)  
  5. java.sql.SQLException: No suitable driver found for 'jdbc:mysql://localhost:3306/UserDB  
  6.     at java.sql.DriverManager.getConnection(DriverManager.java:604)  
  7.     at java.sql.DriverManager.getConnection(DriverManager.java:221)  
  8.     at com.journaldev.jdbc.DBConnection.getConnection(DBConnection.java:24)  
  9.     at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:15)  
  10. Exception in thread "main" java.lang.NullPointerException  
  11.     at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:16)  




解决这类问题的方法就是,检查下日志文件,像上面的这个日志中,URL串是'jdbc:mysql://localhost:3306/UserDB,只要把它改成jdbc:mysql://localhost:3306/UserDB就好了。 

什么是JDBC的最佳实践? 

数据库资源是非常昂贵的,用完了应该尽快关闭它。Connection, Statement,

  • ResultSet等JDBC对象都有close方法,调用它就好了。
  • 养成在代码中显式关闭掉ResultSet,Statement,Connection的习惯,如果你用的是连接池的话,连接用完后会放回池里,但是没有关闭的ResultSet和Statement就会造成资源泄漏了。
  • 在finally块中关闭资源,保证即便出了异常也能正常关闭。
  • 大量类似的查询应当使用批处理完成。
  • 尽量使用PreparedStatement而不是Statement,以避免SQL注入,同时还能通过预编译和缓存机制提升执行的效率。
  • 如果你要将大量数据读入到ResultSet中,应该合理的设置fetchSize以便提升性能。
  • 你用的数据库可能没有支持所有的隔离级别,用之前先仔细确认下。
  • 数据库隔离级别越高性能越差,确保你的数据库连接设置的隔离级别是最优的。
  • 如果在WEB程序中创建数据库连接,最好通过JNDI使用JDBC的数据源,这样可以对连接进行重用。
  • 如果你需要长时间对ResultSet进行操作的话,尽量使用离线的RowSet。
分享到:
评论

相关推荐

    java jdbc ssh面试题

    - **设计模式**:了解常见的23种设计模式,如单例、工厂、装饰器、代理等,并能结合实际场景进行应用。 2. **Spring**: - **IoC/DI**:控制反转(IOC)和依赖注入(DI)的概念,如何通过XML配置或注解实现。 - ...

    JDBC面试题1

    JDBC 面试题中提到的知识点涵盖了许多关键概念: 1. **JDBC**:Java Database Connectivity,是 Java 语言与各种数据库之间的桥梁,提供了一组标准的接口,使得程序员可以使用统一的方式来操作各种关系型数据库,...

    JAVA面试 jdbc jaee mvc设计模式

    本文将深入探讨在Java面试中经常出现的一些核心知识点,包括JDBC、J2EE、MVC设计模式、Servlet、XML、线程以及面试技巧。 首先,JDBC(Java Database Connectivity)是Java与数据库交互的标准接口。它允许Java应用...

    Java常见笔试、面试题目深度剖析

    这份资源"Java常见笔试、面试题目深度剖析"显然是为了帮助求职者更好地准备相关考试而设计的。以下将对Java笔试和面试的一些核心知识点进行详细的阐述: 1. **基础语法**:Java的基础包括变量、数据类型、运算符、...

    jdbc面试题目

    ### JDBC面试题目详解 #### 1. `Class.forName` 是什么?为什么需要它? `Class.forName` 是一个Java反射机制中的方法,用于加载指定类名的类...以上内容涵盖了JDBC相关的常见面试题目及其解答,希望对大家有所帮助。

    java常见面试题

    在面试中,常见的问题包括面向对象的特征、String 和 StringBuffer 的区别、运行时异常与一般异常的区别、Servlet 生命周期、集合框架等等。下面我们将详细解释这些知识点。 一、面向对象的特征 面向对象编程(OOP...

    常用jdbc包和面试题

    面试题方面,以下是一些常见的JDBC相关问题: 1. **JDBC的生命周期是什么?** JDBC的生命周期包括加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL、处理结果集、关闭资源(ResultSet、...

    java常见面试题(史上最全最经典)

    Java面试中的知识点涵盖广泛,包括基础语法、类与继承、内部类、异常处理、线程、集合、IO、虚拟机等多个领域。对于MySQL这一部分,我们深入探讨一下: 1. **ID自增策略**:在MySQL中,如果一个表有自增主键,并且...

    Java常见面试题.rar

    这份“Java常见面试题.rar”压缩包文件显然为求职者提供了全面的准备材料,旨在帮助他们应对可能出现的各种Java面试挑战。 在Java面试中,常见的知识点包括但不限于以下几个方面: 1. **基础语法**:这是面试的...

    2018年java常见面试题

    - **JDBC**:Java Database Connectivity,用于连接和操作数据库的API。 - **事务管理**:理解ACID属性(原子性、一致性、隔离性和持久性)。 10. **框架应用:** - **Spring框架**:依赖注入和面向切面编程,...

    Java 最常见 200+ 面试题全解析:面试必备208题

    2. **面向对象**:Java是面向对象的语言,理解类与对象的概念、构造器、封装、继承、多态性以及抽象类与接口是面试中的常见问题。此外,访问修饰符(public、private、protected、默认)和final关键字的作用也是重点...

    oracle常见面试题

    - JDBC和ODBC是常见的连接Oracle数据库的方式,理解它们的工作原理和使用场景。 12. **数据库安全性** - 权限管理、角色、审计和网络保护是数据库安全的重要组成部分,面试时可能需要解释如何设置和管理这些。 ...

    Java常见笔试,面试题目深度剖析

    以下是对标题和描述中涉及的Java常见面试题目的深度剖析: 1. **字符串(String)**:Java中的字符串是不可变的,这意味着一旦创建,就不能更改其内容。String类提供了丰富的API,如substring()、indexOf()、replace...

    2019最新整理Java面试题,常见面试题及答案汇总(史上最全最权威).rar

    这份"2019最新整理Java面试题"是针对Java程序员的一份全面资源,包括了常见面试问题及其解答,旨在帮助面试者准备面试,同时也为Java技术栈的扩展提供了宝贵的学习材料。 首先,Java基础知识是面试中的常考点,包括...

    Mybatis 常见面试题总结及答案

    mybatis面试题 Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理...本资源包括了Mybatis 常见面试题资源,内容比较丰富,有需要的朋友可以下载。

    clickhouse高频面试题

    ClickHouse 高频面试题总结 ClickHouse 是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),主要用于 WEB 流量分析。它非常适用于商业智能领域,除此之外,也能够被广泛应用于广告流量、Web、App 流量、电信...

    Java常见面试题汇总高频面试题

    10. **数据库操作**:虽然Java面试不一定深入数据库层面,但SQL查询语言的基本操作、事务管理、连接池等知识是必备的,特别是JDBC接口的使用。 11. **Spring框架**:Spring是Java企业级应用的主流框架,涉及依赖...

    Java常见 面试题目

    以下是从“Java常见面试题目”这一主题中提炼出的一些关键知识点,旨在帮助求职者更好地准备面试。 ### 一、Java基础概念 1. **类与对象**:Java是一种面向对象的编程语言,类是对象的模板,而对象则是类的实例。...

Global site tag (gtag.js) - Google Analytics