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

  有时候事务包含了一组语句,而我们希望回滚到这个事务的某个特定的点。JDBC的保存点可以用来生成事务的一个检查点,使得事务可以回滚到这个检查点。

  一旦事务提交或者回滚了,它生成的任何保存点都会自动释放并失效。回滚事务到某个特定的保存点后,这个保存点后所有其它的保存点会自动释放并且失效。可以读下这个了解更多关于JDBC Savepoint的信息。

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

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

  • 缓存PreparedStatement以便更快的执行

  • 可以设置连接超时时间

  • 提供日志记录的功能

  • ResultSet大小的最大阈值设置

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

  关于JDBC数据源的示例请看下这里。

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

  对部署在servlet容器中的WEB程序而言,创建数据库连接池非常简单,仅需要以下几步。

  • 在容器的配置文件中创建JDBC的JNDI资源,通常在server.xml或者context.xml里面。像这样:

    <Resource name="jdbc/MyDB"global="jdbc/MyDB"auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/UserDB"username="pankaj"password="pankaj123"maxActive="100"maxIdle="20"minIdle="5"maxWait="10000"/>
    
    <ResourceLink name="jdbc/MyLocalDB"global="jdbc/MyDB"auth="Container"type="javax.sql.DataSource" />
    
  • 在WEB应用程序中,先用InitialContext来查找JNDI资源,然后获取连接。

    Context ctx = new InitialContext();
    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的脏读是什么?哪种数据库隔离级别能防止脏读?

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

  数据库的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和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数据源来创建连接都有可能抛出这种异常。它的异常栈看起来会像下面这样。

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL ''jdbc:mysql://localhost:3306/UserDB'at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
java.sql.SQLException: No suitable driver found for 'jdbc:mysql://localhost:3306/UserDBat java.sql.DriverManager.getConnection(DriverManager.java:604)at java.sql.DriverManager.getConnection(DriverManager.java:221)at com.journaldev.jdbc.DBConnection.getConnection(DBConnection.java:24)at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:15)
Exception in thread "main" java.lang.NullPointerExceptionat 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。

  译注:终于翻译完了,希望能对你的面试有所帮助。拿个好offer!

转载自:http://www.admin10000.com/document/4072.html

转载于:https://blog.51cto.com/chenmg/1381670

JDBC常见面试题集锦(二)相关推荐

  1. html5退出全屏触发的方法_好程序员web前端分享HTML5常见面试题集锦二

    web前端分享HTML5常见面试题集锦第二篇,希望对大家有所帮助. 1. 方法1: html,body{height: 100%;} body{ margin: 0;display: flex; ju ...

  2. JDBC常见面试题集锦(一)

    2019独角兽企业重金招聘Python工程师标准>>> 什么是JDBC,在什么时候会用到它? JDBC的全称是Java DataBase Connection,也就是Java数据库连 ...

  3. Java工程师常见面试题集锦

    Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新) 2019年01月02日 14:01:14 CSDNedu 阅读数:653 大牛也怕面试题,尤其是基础题,在面试中如果出现 ...

  4. 【面试题】Java常见面试题集锦

    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...

  5. html5 将id的值用于top_web前端分享HTML5常见面试题集锦四

    web前端分享HTML5常见面试题集锦四 1.为什么要初始化CSS样式? 答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异. 当 ...

  6. js怎么在一个div中嵌入另一网站_好程序员web前端学习路线分享HTML5常见面试题集锦一...

    好程序员web前端学习路线分享HTML5常见面试题集锦,接下来将会持续为大家分享几篇HTML5常见面试题. 1.布局 左边20% 中间自适应 右边200px 不能用定位 答案:圣杯布局/双飞翼布局或者 ...

  7. JDBC常见面试题(修订版)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 以下我是归纳的JDBC知识点图: 在公众号下回复&q ...

  8. Python爬虫常见面试题(二)

    前言 之所以在这里写下python爬虫常见面试题及解答 一是用作笔记,方便日后回忆: 二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正: 三是我也是互联网寒潮下岗的那批人之一 ...

  9. mysql某个表的列除以2_mysql常见面试题(二)

    mysql常见面试题(二) 标签:范式 索引 复制原理 事务引擎 储存结构 内存分配 1.数据库三范式是什么? 第一范式(1NF):字段具有原子性,不可再分.(所有关系型数据库系统都满足第一范式数据库 ...

最新文章

  1. 互联网协议 — Ethernet 局域网技术的发展
  2. UNICODE_STRING 总结
  3. 802.11ac/ax (wifi6)中的Beamforming技术介绍
  4. springboot生成包含特定数字_面试必问 —— Spring Boot 是如何实现自动配置的?
  5. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
  6. 平台和计算机技术,两大平台技术提升及优势功能PK对比
  7. Apache JMeter 压测webservice接口
  8. jQuery跨域,添加自定义头部header
  9. 搬砖的也能学Python----if - elif 语句
  10. UCMA(OCS) 开发系列之二(安装与部署)
  11. python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
  12. mysql基本语法 外键_MySQL语法创建外键?
  13. [Android] 安卓迅雷带云盘内测版7.0 简洁 无广告 官方版
  14. 健身为什么要吃肌酸!肌酸四大作用
  15. java jlabel 字体加粗_这样在java里面的标签Jlabel设置字体加粗和下划线
  16. 码隆科技在 CVPR 2019 主办商品识别大赛,等你来战!
  17. windows录屏_电脑如何录制屏幕?windows录屏软件哪个好?
  18. 使用OmicShare Tools做权重网络图
  19. python语言与蟒蛇_1、python语言是一种“大蟒蛇语言‘’,但是python语言却和蟒蛇没有任何关系_学小易找答案...
  20. html在线商城购物网站制作——基于HTML+CSS+JavaScript鲜花礼品电商网站

热门文章

  1. xor java_java基于密匙的xor加解密
  2. LeetCode Flatten a Multilevel Doubly Linked List(dfs)
  3. ubuntu17.04下mysql5.7.18源码安装
  4. LeetCode Mini Parser(栈操作)
  5. qrencode二维码生成在linux下的编译
  6. rest-framework:认证组件
  7. 认识less和webstrom的less配置
  8. LiveBos---扩展按钮调用方法
  9. ubuntu 10.0.4安装小企鹅(Fcitx)输入法
  10. 迷难的北京行 – 2012.08.19