导航:首页 > 源码编译 > jdbcdriver源码分析

jdbcdriver源码分析

发布时间:2022-12-14 23:58:56

1. 12. sharding-jdbc源码之强制路由

位于 sharding-jdbc-core 模块下的包 com.dangdang.ddframe.rdb.sharding.hint 中,核心类 HintManagerHolder 的部分源码如下:

ThreadLocal中管理的 HintManager 定义如下:

分析了sharding-jdbc的强制路由实现的源码,接下来说说如何使用这一niubility特性,假定数据源定义如下:

2. Driver driver = new com.mysql.jdbc.Driver( ); 用通俗的语言怎么解释这句代码 在线等.....

jdbc和连接池对于你这个场景来说,都足够,既然用spring管理了,建议还是使用连接池,另外,spring自身没有实现连接池,一般都是对第三方连接池的包装,常见的有C3P0,dbcp以及最近比较流行的boneCP等,这几个配置都差不多太多,以boneCP为例:
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>

3. 深入理解spark核心思想与源码分析 怎么样

SparkSQL主要的推动者是Databricks。提到SparkSQL不得不提的就是Shark。Shark可以理解为Spark社区这边搞的一个”HiveonSpark”,把Hive的物理执行计划使用Spark计算引擎去执行。这里面会有一些问题,Hive社区那边没有把物理执行计划到执行引擎这个步骤抽象出公共API,所以Spark社区这边要自己维护一个Hive的分支,而且Hive的设计和发展不太会考虑到如何优化Spark的Job。但是前面提到的HiveonSpark却是和Hive一起发布的,是由Hive社区控制的。所以后来Spark社区就停止了Shark的开发转向SparkSQL(“坑了”一部分当时信任Shark的人)。SparkSQL是把SQL解析成RDD的transformation和action,而且通过catalyst可以自由、灵活的选择最优执行方案。对数据库有深入研究的人就会知道,SQL执行计划的优化是一个非常重要的环节,SparkSQL在这方面的优势非常明显,提供了一个非常灵活、可扩展的架构。但是SparkSQL是基于内存的,元数据放在内存里面,不适合作为数据仓库的一部分来使用。所以有了SparkSQL的HiveContext,就是兼容Hive的SparkSQL。它支持HiveQL,HiveMetastore,HiveSerDesandHiveUDFs以及JDBCdriver。这样看起来很完美,但是实际上也有一些缺点:SparkSQL依赖于Hive的一个snapshot,所以它总是比Hive的发布晚一个版本,很多Hive新的feature和bugfix它就无法包括。而且目前看Spark社区在Spark的thriftserver方面的投入不是很大,所以感觉它不是特别想朝着这个方向发展。还有一个重要的缺点就是SparkSQL目前还不能通过分析SQL来预测这个查询需要多少资源从而申请对应的资源,所以在共享集群上无法高效地分配资源和调度任务。

4. 如何找到mysql-jdbc驱动源码

在工程中右键新建file,命名为jdbc.properties

创建完毕如图:

在jdbc.properties文件中输入如下信息,分别是数据库的驱动,连接,用户名和密码

新建JdbcTest2.java

输入如下代码:

代码说明:
这段代码是读取配置文件,把配置文件中的各个项通过名称读取出来

这段代码是通过反射来创建Driver对象,反射就是类的实例化

在主函数中输入如下,测试方法

运行之后的结果如下,表示连接成功!

5. 帮分析一下 java.sql.SQLException: 源代码 和 报错 情况如下.

先检查是不是密码用户名端口都正确
还不行就,别用localhost,改用127.0.0.1
还不行你就安装sqlserver 2000 sp3
还不行,你看看是不是sqlserver禁止使用你的tcp/ip协议
还不行换个端口别用1433,1433好像有bug
再不行,你就祈祷吧

6. jsp中用于加载数据库驱动的接口是

JDBC由Sun公司制定,全称Java DataBase Connectivity,是一种可以执行SQL语句并可返回结果的Java API,支持多种关系型数据库,封装在java.sql.*

它的具体位置在\jre7\lib\rt.jar

1、JDBC的工作原理

JDBC的最大特点是独立于具体的关系型数据库,它定义了一系列的Java类,完成数据库连接(Connections)、SQL语句(Statements)、结果集(ResultSet)和其他的数据库对象,从而达到Java程序和数据库交互的目的

2、JDBC的四种驱动类型

在Java程序中,JDBC可以分为以下4种驱动类型:

(1)JDBC-ODBC Bridge

用JDBC-ODBC Bridge可以访问一个ODBC数据源,但在执行Java程序的机器上必须安装ODBC驱动,并完成配置

可以看出,中间存在一个JDBC-ODBC的转换,影响了执行的效率

(2)JDBC Native Bridge

这种方式需要在执行JSP程序的机器上安装本地的针对特定数据库(MySQL/SQL/Oracle)的驱动程序,通过这个程序把对数据库的JDBC调用转化为数据库的API调用,性能比JDBC-ODBC更好,缺点是要安装驱动

(3)JDBC-Network Bridge

这种方式不需要安装驱动程序,直接用JDBC通过网络连接数据库,与平台无关,所以在WEB开发中大量使用

(4)Pure Java JDBC Driver

Java驱动程序运行在客户端,客户端可以直接访问数据库,其体系结构最为简单,因此安全性及程序的逻辑性不行

3、JDBC连接数据库(以mysql为例)

(1)加载JDBC驱动程序

通过java.lang.Class类中的静态方法forName实现

(2)提供JDBC连接的URL

协议:子协议:数据源标识

其中,协议:在JDBC中总是以jdbc开始

子协议:是Bridge的驱动程序或是数据库管理系统名称,如MySQL就是mysql,常用的端口号是3306

数据源标识:标记找出数据源的地址和连接接口

(3)创建数据库的连接

向java.sql.DriverManager请求获取Connection对象

(4)创建Statement

其中Statement分为三类,区别如下:

A、执行静态SQL:通过Statement实例实现

B、执行动态SQL:通过PreparedStatement实例实现

C、执行数据库存储过程:通过CallableStatement实例实现

(5)执行SQL语句,完成数据库的增删改或是查询功能

其中Statement接口提供了三种执行SQL语句的方法,区别如下:

A、Result executeQuery(String sqlString):用于查询数据库的SQL,如SELECT,返回一个结果集(ResultSet)

B、int executeUpdate(String sql):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL(数据定义)语句

C、boolean execute(String sql):用于返回多个结果集、多个更新计数或者二者组合(不太懂)

(6)得到处理结果(ResultSet)

(7)关闭JDBC对象

先关闭Statement再关闭Connection连接

参考文献:

1、邓子云,《JSP网络编程从基础到实践》(第2版)

2、邱加永,孙连伟,《JSP基础与案例开发详解》

3、谭贞军,《深入理解Java Web开发技术:探索基于主流框架的最佳组合》

文章知识点与官方知识档案匹配
Java技能树使用JDBC操作数据库JDBC概述
84644 人正在系统学习中
打开CSDN,阅读体验更佳

jsp学习笔记之JDBC原理及其使用_地球是圆嘀的博客
java项目的导包方式与javaweb项目的导包方式不一样 java项目:1.jar复制到工程这种 2.右键jar:build path 3.add external jars javaweb项目 1.jar项目复制到WEB-INF的lib中 核心:将java中的JDBC代码,复制到JSP中的<% %> ...
JSP原理、使用_lpw666_的博客
JDBC 固定步骤: 事务 Junit单元测试 搭建一个环境,事务回滚 1、JSP 1.1、什么是JSP Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术! 最大的特点: 写JSP就像在写HTML ...
关键技术——JSP与JDBC应用详解(电子版)
本书详细讲解了JSP和JDBC内容,适合Java开发人员使用,也是Java开发人员必须掌握的知识
java连接数据库——JSP实现JDBC
前两个是java连接数据库的典型方式,虽然除了JDBC还有odbc的方式,但odbc的效率和跨平台都不理想,所以现在的趋势就是使用JDBC来连接需要的数据库(我以MySQL为例),这节将介绍JSP中如何实现连接数据库,其实原理都一样,只是技术不同,建议在看本节知识的时候,以及对JSP技术和前端知识有一定的了解,要不然,或许不好理解。 以下是代码: <%@ page language="...
继续访问
JDBC 详解_IT__learning的博客_jdbc
三、JDBC 工作原理 1、装载驱动程序 JDBC 中规定,驱动类在被加载时,需要自己“主动”把自己注册到 DriverManger 中。com.mysql.jdbc.Driver 类的源代码如下: 通过以上源码可知我们注册驱动的时候只是 new 了自己,也就是 Driver。既然...
jsp学习 jdbc访问数据库_黑猫猫琉璃的博客
Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp", "root", "123456"); 3、创建sql会话对象preparedStatement(注意这个动态的preparedStatement类它的父类其实是Statement) ...
最新发布 jdbc的原理示意图和模拟实现
本次博客带领大家学习JDBC的原理示意图和模拟实现。
继续访问

jsp,servlet,类,jdbc项目运行原理以及最开始打开的页面需要传递数据时的处理
实现一个web项目时,显示主要靠的是html页面,这属于静态显示。而动态显示就需要用到jsp页面。 静态页面间的跳转主要是通过a标签,而动态页面跳转也是通过a标签,但是需要传递数据。当然也可以通过表单的提交。 页面呢,也分为传递数据的页面和接收数据的页面。 传递数据的页面呢,是通过a标签后面携带的参数跳转到需要接收数据的页面以保证接收数据的页面动态的数据显示,或者通过表单提交的对应servl...
继续访问
JavaWeb——JSP原理剖析和执行过程_万里顾—程的博客
JavaWeb——JSP原理剖析 1.什么是JSP JSP(Java Server Pages):Java服务器端页面,和Servlet一样,是一种动态网页开发技术。 JSP是一种Java servlet,基于Java Servlet API 因此,JSP拥有各种强大的企业级Java API,包括JDBC, JNDI(Java Na...
jdbc连接mysql原理_JDBC 原理浅析_月塔的博客
五.详解JDBC原理: <1>. 结构: DriverManager (是一工厂实现类,用了工厂方法模式) | Dirver (是驱动程序对象的接口,指向具体数据库驱动程序对象=DriverManager.getDriver(String URL)) |
JSP中操作数据库的三个对象:Statement、PreparedStatement、CallableStatement
1、创建 Statement 对象 建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段中所示: Connection con = DriverManager.getConnection(url, "sunny", ""); Statement stmt = con.c
继续访问
JSP访问数据库
JSP访问数据库内容介绍
继续访问

Java中原生操作JDBC连接及原理_架构潜行之路的博客_java原生j...
JDBC全称又叫做Java DataBase Connectivity,也就是Java数据库连接,说白了就是用Java语言来操作数据 库,提供统一API访问数据库操作。 二、原理 JDBC主要是用于java连接数据库的,能连接什么数据库不固定,其实能连接很多种数据库,而且一般来...
JDBC编程的三个接口
JDBC编程的Connention接口,Statement接口和ResulSet接口,JDBC编程一个简单的查询过程
继续访问
3-JSP+JDBC数据库应用开发初步(二)
一、JSP+Servlet+JDBC开发数据库应用 上一讲“JSP+JDBC数据库应用开发初步”中,我们给出了一个小例子,采用JSP页面来处理用户的登录请求。本讲中,我们将该JSP页面替换为Servlet来处理用户登录请求。 实验步骤如下: 用户登录页面仍然采用原来的login.jsp页面,只需要把form表单的action方法修改为Servlet的url即可,其它不变。 资源页面也仍然采用resource.jsp不变,注意:该页面需要读取session中保存的用户名,若存在,则说明用户登录成功,可以显示
继续访问
java、jdbc、jsp……的简单解释
java版本 1. J2ME,功能有限,用于嵌入式设备。 2. J2SE,包含原始的核心类库,用于桌面应用程序和浏览器中的applet 3. J2EE,功能非常全面,用于数据处理和处理器端应用 J2EE功能非常的全面,那就看看它的工作模式图: JDBC是什么? 它是为java开发人员提供了一个行业标准API,可以在java应用与关系数据库之间建立起独立于数据库的连接,A...
继续访问

JSP基础(十二)——初步认识JDBC
与数据库交互是Web应用程序的一个重要的组成部分,JSP使用JDBC(Java DataBase Connectivity)技术来实现与数据库的连接。JDBC提供了JSP操作数据库的各种接口,所以JDBC数据库编程对Web开发是非常重要的。很多DBMS(数据库管理系统)都提供JDBC驱动程序,JSP可以直接利用它访问数据库,有些DBMS没有提供JDBC驱动程序,JSP可以通过Sun公司的JDBC-
继续访问
JDBC在jsp中的使用
今天在学习JDBC在jsp中的应用时遇到了一些问题,解决后记录一下,希望对其他人能有帮助。 默认读者具有一定的jsp和数据库知识,所以对这两者不做介绍,本文主要是解决按照书上的代码敲出来最后却不能得到想要的结果的问题。 第一步,导包 导入需要的包,例如java.sql.* java.io.* 第二步,加载数据库驱动 大家为了更好的记忆操作步骤,不要每次建立数据库连接时都要找资料,我们应该了解每一步都是为了达到什么目的,例如现在的加载数据库驱动,可能有人会问?什么是数据库驱动呢? 数据库驱动是不
继续访问
JDBC,数据库与jsp的连接
JDBC技术的出现 为何会出现JDBC?对于我们的数据来说,都是具有时效性的,而有些数据是需要长久的保存下去,但是单单jsp并不能做到长久保存,因此我们需要将其保存在专门储存在数据库中,而jsp再次使用此数据的时候需要调用,因此就需要有一个中间的桥梁将数据库与jsp连接起来。但是最开始只有OBDC,OBDC是C语言开发的,主要再Windows环境中使用,如果用其他语言开发应用程序还需要其他中介的API和OBDC做沟通链接,这是很复杂的事。因此JDBC应运而生,这是专门针对Java和数据库连接技术,使得开发人
继续访问
JSP+JDBC连接数据库
首先 在创建项目时,要连接数据库,要将jar包导入项目(这只是方式之一,还有其他的方式实现同样的效果) 将jar包放在WEB-INF/lib目录下,然后右键,点击Build Path→Add to Build Path将其添加到项目的Libraries中,然后在JSP页面中头部添加如下代码 <%@page import="java.sql.*"%> 即图中所示: 接下来就可以打代码了。 数据库的连接 //1.获取Driver实现类的对象 Class.forName("com.mysql.
继续访问

JSP和JDBC的使用
查询数据 <%@ page import="java.sql.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang="en">
继续访问
认识JSP连接数据库原理
昨天有人来问JSP用jdbc连接数据库的两种方式,我懵了,才发现自己真的烂到家了,连这个都不知道,只会按网上说的方法写代码,根本就不懂原理,我需要知道原理。从网上查到一些说法,我综合整理了一下得出一些结论: 有人说JSP网站连接数据库有4种类型: [1]JDBC-OD
继续访问
关于Java Web的Servlet+JDBC(封装)+JSP的登录(送给入门的你)
关于Java Web的Servlet+JDBC(封装)+JSP的登录(送给入门的你)
JDBC与JSP初识
主要内容: -JDBC 三层架构进行组织后台代码 -JSP初识 - 在页面展示表中数据 - 在页面输入数据并处理数据课堂参考代码: 1、后台代码: (1)cn.st.. BaseDao.javapackage cn.st.; import java.sql.Connection; import java.sql.DriverManage
继续访问
初学JSP与JDBC(mysql数据库)
之前一直不知道jsp怎么和数据库连接,后来看了大神的博客以及看书大概知道了一些。 1.下好jdbc的包。见链接。 把下载好的包放在tomcat的lib文件夹下面,然后建立一个web工程导入这个包。 ->build path->configure build path-> 然后就导入成功了。 我用的是mysql数据库。(数据库方面我就不多做解释,不懂的可以去查一查。) 2.JDB
继续访问
关于jsp+jdbc的简单实例
在页面显示所查数据库的内容,以表格形式显示 <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@page import="java.sql.ResultSet"%> <%@page import="java.sql.SQLException&q
继续访问
JSP——JDBC相关
参考博客:https://www.cnblogs.com/xiaotiaosi/p/6394554.html JDBC中常用的类和接口: 1、驱动程序管理类:DriverManager 这个类是很重要的一个类,使用的频率也是比较高的,对于一般程序员来说 用的最多的一个方法就是Drivermanager.getConnection

7. oracle jdbc驱动源代码

可以用JD-GUI反编译jar

8. JDBC的工作原理是什么

JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术。
JDBC工作原理主要分3个步骤:1、加载数据库驱动。2、获取数据库连接。3、发送sql语句访问数据库 。
1、加载数据驱动:使用Class.forName方法,调用这个方法会加载数据库驱动com.MySQL.jdbc.driver。
关于数据库驱动的理解,其实是sun公司给了一个Driver的接口,然后各个数据厂商根据自己的数据库
来实现这个接口。当要访问数据库的时候,需要引入这个第三方类库。类的加载主要分为5个部分,
加载、验证、准备、解析、初始化。在初始化的部分用到了DriverManager.registerDriver()方法,将
自己注册给DriverManager的Driver接口。这个地方体现了多态。这个时候就可以使用Driver了。
2、获取数据库连接DriverManager.getConnection()。这个方法主要调用driver的connect()方法
返回一个实现了Connection接口的对象。
3、然后利用Connection对象创建Statement,发送sql语句访问数据库。
延伸:JDBC基础知识

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。
1、跨平台运行:这是继承了Java语言的“一次编译,到处运行”的特点;
2、不受数据库供应商的限制:巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发人员通过SQL调用数据库和处理结果,而不需要考虑数据库的提供商;另一个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利用JDBC API创建Java程序和数据源之间的桥梁。应用程序只需要编写一次,便可以移到各种驱动程序上运行。Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就可以被识别,就可以正常工作。所以JDBC不受数据库供应商的限制。
JDBC API可以作为连接Java应用程序与各种关系数据库的纽带,在带来方便的同时也有负面影响,以下是JDBC的优、缺点。优点如下:

· 操作便捷:JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数;
· 可移植性强:JDBC支持不同的关系数据库,所以可以使同一个应用程序支持多个数据库的访问,只要加载相应的驱动程序即可;
· 通用性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;
· 面向对象:可以将常用的JDBC数据库连接封装成一个类,在使用的时候直接调用即可。
缺点如下:
· 访问数据记录的速度受到一定程度的影响;
· 更改数据源困难:JDBC可支持多种数据库,各种数据库之间的操作必有不同,这就给更改数据源带来了很大的麻烦

9. jsp连接Access

开始接触JDBC时,一直有一个疑虑,为什么执行Class.forName(“com.mysql.jdbc.Driver“)就可以载入MySql的驱动程序?JDBC的驱动程序初始化过程是怎么样的?连接具体的数据库时,JDBC的DriverManager又是如何运作的?带着这么几个疑惑,本人下载了MySql的驱动源代码,结合J2SDK的源代码,分析了一下JDBC的驱动管理机制。

1. 分析JDBC的驱动程序管理部分的实现代码:

在JDBC的层次上,sun主要定义了1个接口Driver和两个类:DirverManager和DriverInfo。每个JDBC驱动程序必须实现Driver接口(在MySql的Connector/J驱动中,这个叫做com.mysql.jdbc.Driver)。而DriverManager则负责管理所有的Driver对象,包含注册Driver;选择合适的Driver来建立到某个数据库的连接;以及进行一些Driver的信息管理等。DriverInfo非常简单,用于保存Driver的信息,只有3个成员变量,Driver,DriverClass和DriverClassName,意义非常明显。

先看一下在DriverManager.java中的关键代码:
private static java.util.Vector drivers = new java.util.Vector();
所有的Driver对象保存在一个Vector数组中。

注册Driver的函数叫registerDriver,将需要注册的Driver对象传入即可:
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
if (!initialized) { //如果没有初始化,则先初始化
initialize();
}
DriverInfo di = new DriverInfo(); //实际保存的不是Driver,而是一个DriverInfo对象,但是DriverInfo的其它成员完全可以由Driver推导出来,所以个人觉得DriverInfo对象可有可无,直接使用Driver应该就可以了。
di.driver = driver;
di.driverClass = driver.getClass();
di.driverClassName = di.driverClass.getName();
drivers.addElement(di); //将DriverInfo对象添加到数组中
println("registerDriver: " + di);
}

这样就完成了驱动程序的注册过程。然后重点看一下建立数据库连接的代码,在getConnection函数中,省略了一些非关键代码:
private static synchronized Connection getConnection(
String url, java.util.Properties info, ClassLoader callerCL) throws SQLException {

SQLException reason = null;
//轮询所有的DriverInfo对象。
for (int i = 0; i < drivers.size(); i++) {
DriverInfo di = (DriverInfo)drivers.elementAt(i);
try {
//使用DriverInfo中的Driver对象去做实际的连接数据库的工作
Connection result = di.driver.connect(url, info);
if (result != null) {
// Success!
println("getConnection returning " + di);
return (result); //一旦成功连接,直接返回Connection对象,然后推出
}
} catch (SQLException ex) {
...
}
}
//这就是经常看到的出错信息--找不到合适的驱动程序。
println("getConnection: no suitable driver");
throw new SQLException("No suitable driver", "08001");
}
由上面的getConnection函数可以看到,真正实现数据库连接的是Driver对象的connect函数。而且可以看到,由于DriverManager.getConnection使用的是一种轮询的方式,注册的驱动程序越多,连接速度会越慢。JDBC连接数据库的速度很慢,是不是和这种实现方式有关联呢?怀着这个问题,本人下载了MySql的Connector/J驱动包,开始分析其connect函数的实现。

2. 分析MySql的注册和建立连接部分的代码:
打开MySql的源码包,首先分析其Driver类的实现。发现Driver类的实现非常简单,
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
可以看到,有一段static代码,调用了DriverManager的registerDriver方法。这其实就解释了Class.forName(“com.mysql.jdbc.Driver”)能够完成MySql驱动注册的问题。因为forName会导致这段static代码被调用,从而间接调用了registerDriver,完成注册过程。

com.mysql.jdbc.Driver从com.mysql.jdbc.NonRegisteringDriver继承而来,实际上是NonReisteringDriver完成了java.sql.Driver接口的实现工作。转移目标,分析NonRegisteringDriver的connect函数。

NonRegisteringDriver.connect的实现也比较简单,正合我意:

public java.sql.Connection connect(String url, Properties info)
throws SQLException {

//1. 分析传入的连接字符串.
if ((props = parseURL(url, info)) == null) {
return null;
}
try {
//2. 建立一个Connection对象完成实际的数据库连接工作
Connection newConn = new com.mysql.jdbc.Connection(host(props),
port(props), props, database(props), url, this);
return newConn;
非常简单,先parseURL,然后使用Connection去建立连接。parseURL只是简单的字符串分析,主要是分析传入的连接字符串是否满足“jdbc:mysql://host:port/database“的格式,如果不满足,直接返回null,然后由DriverManager去试验下一个Driver。如果满足,则建立一个Connection对象建立实际的数据库连接,这不是本人关注的问题,源码分析就此打住。

这也就解释了第二个问题,DriverManager的轮询查询注册的Driver对象的工作方式所带来的性能代价并不是很大,主工作量只是parseURL函数。

10. 在jdbcapi,statement哪个方法可以用来限制查询返回的记录数

jdbc驱动
java jdbc连接_2019最新JDBC面试题(附JDBC教程)

weixin_39665379
关注
0点赞·410人阅读
1.什么是JDBC API,何时使用它?

Java DataBase Connectivity API允许我们使用关系数据库。JDBC API接口和类是part java.sql和javax.sqlpackage的一部分。我们可以使用JDBC API来获取数据库连接,在数据库服务器中运行SQL查询和存储过程并处理结果。
JDBC API的编写方式允许我们的Java程序和实际的JDBC驱动程序之间的松散耦合,这使我们可以轻松地从一个数据库切换到另一个数据库服务器。

2.JDBC驱动程序有哪几种类型?

有四种类型的JDBC驱动程序。任何与数据库一起工作的java程序都有两个部分,第一部分是JDBC API,第二部分是执行实际工作的驱动程序。

JDBC-ODBC Bridge加ODBC驱动程序(类型1):它使用ODBC驱动程序连接到数据库。我们应该安装ODBC驱动程序来连接数据库,这就是为什么这个驱动程序几乎已经过时的原因。

Native API部分支持Java技术的驱动程序(类型2):此驱动程序将JDBC类转换为数据库服务器的客户端API。我们应该安装数据库客户端API。由于对数据库客户端API驱动程序的额外依赖性,这也不是首选驱动程序。

用于数据库中间件的纯Java驱动程序(类型3):此驱动程序将JDBC调用发送到可以连接到不同类型数据库的中间件服务器。我们应该安装一个中间件服务器来使用这个驱动程序。这增加了额外的网络调用和性能降低,这就是为什么不广泛使用JDBC驱动程序。

直接到数据库的纯Java驱动程序(类型4):此驱动程序将JDBC调用转换为数据库服务器可以理解的网络协议。该解决方案简单,适用于网络上的数据库连接。但是对于此解决方案,我们应该使用特定于数据库的驱动程序,例如Oracle for Oracle DB的OJDBC jar和MySQL Connector的MySQL Connector / J.

3.JDBC API如何帮助我们实现Java程序和JDBC驱动程序API之间的松散耦合?

JDBC API使用Java Reflection API实现java程序和JDBC驱动程序之间的松散耦合。如果你看一个简单的JDBC例子,你会发现所有的编程都是用JDBC API完成的,而驱动程序只有在通过反射使用Class.forName()方法加载时才会出现。

我认为这是在核心java类中使用Reflection的最佳示例之一,以确保我们的应用程序不能直接使用Drivers API,这使得从一个数据库移动到另一个数据库变得非常容易。

4.什么是JDBC连接?解释在简单的java程序中获取数据库连接的步骤。

JDBC Connection就像使用数据库服务器创建的Session。您还可以将Connection 视为来自数据库服务器的Socket连接。

创建JDBC连接非常简单,需要两个步骤:

注册并加载驱动程序:使用Class.forName(),驱动程序类注册到DriverManager并加载到内存中。

使用DriverManager获取Connection对象:我们DriverManager.getConnection()通过传递数据库URL字符串,用户名和密码作为参数来获取连接对象。

Connection
5.JDBC DriverManager类有什么用?

JDBC DriverManager是我们通过它获取数据库连接对象的工厂类。当我们加载JDBC Driver类时,它将自己注册到DriverManager,您可以查找JDBC Driver类源代码来检查它。

当我们通过传递数据库配置细节来调用方法DriverManager.getConnection()时,DriverManager使用已注册的驱动程序来获取Connection并将其返回给调用者程序。

6.如何在java程序中获取数据库服务器的详细信息?

我们可以使用DatabaseMetaDataobject来获取数据库服务器的详细信息。成功创建数据库连接后,我们可以通过调用getMetaData()方法获取元数据对象。我们可以使用DatabaseMetaData中的方法来获取数据库产品名称,版本和详细的配置信息。

DatabaseMetaData
7.什么是JDBC Statement?

JDBC API Statement用于在数据库中执行SQL查询。我们可以通过调用Connection createStatement()方法来创建Statement对象。我们可以使用Statement通过不同的执行方法传递查询来执行静态SQL查询,例如execute(),executeQuery(),executeUpdate()等。

由于查询是在java程序中生成的,如果未正确验证用户输入,则可能导致SQL注入问题,可以在SQL注入示例中找到更多详细信息。

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果我们想要使用多个ResultSet对象,则每个对象必须由不同的Statement对象生成。Statement接口中的所有execute()方法都隐式关闭一个statment的当前ResultSet对象(如果存在open对象)。

8.execute,executeQuery,executeUpdate有什么区别?

Statement execute(String query)用于执行任何SQL查询,如果结果是ResultSet(如运行Select查询),则返回TRUE。当没有ResultSet对象(如运行Insert或Update查询)时,输出为FALSE。我们可以使用getResultSet()获取ResultSet和getUpdateCount()方法来检索更新计数。

Statement executeQuery(String query)用于执行Select查询并返回ResultSet。即使没有与查询匹配的记录,返回的ResultSet也永远不会为null。执行select查询时,我们应该使用executeQuery方法,这样如果有人试图执行insert / update语句,它将抛出java.sql.SQLException,并显示消息“executeQuery方法不能用于更新”。

语句executeUpdate(String query)用于执行不返回任何内容的Insert / Update / Delete(DML)语句或DDL语句。输出为int,等于SQL数据操作语言(DML)语句的行数。对于DDL语句,输出为0。

只有在不确定语句类型时才应使用execute()方法,否则使用executeQuery或executeUpdate方法。

9.什么是JDBC PreparedStatement?

JDBC PreparedStatement对象表示预编译的SQL语句。我们可以使用它的setter方法来设置查询的变量。

由于PreparedStatement是预编译的,因此可以使用它多次有效地执行此语句。PreparedStatement是Statement的更好选择,因为它会自动转义特殊字符并避免SQL注入攻击。

10.如何在JDBC PreparedStatement中设置NULL值?

我们可以使用PreparedStatement setNull()方法将null变量绑定到参数。例如,setNull方法将index和SQL Types作为参数 ps.setNull(10, java.sql.Types.INTEGER);。

11.Statement中的getGeneratedKeys()方法有什么用?

有时,表可以使用自动生成的键来插入主键的唯一列值。我们可以使用Statement getGeneratedKeys()方法获取此自动生成密钥的值。

12.PreparedStatement对Statement有什么好处?

PreparedStatement对Statement的一些好处是:

PreparedStatement帮助我们防止SQL注入攻击,因为它会自动转义特殊字符。

PreparedStatement允许我们使用参数输入执行动态查询。

PreparedStatement比Statement快。当我们重用PreparedStatement或使用它的批处理方法执行多个查询时,它变得更加明显。

PreparedStatement帮助我们使用setter方法编写面向对象的代码,而使用Statement我们必须使用String Concatenation来创建查询。如果要设置多个参数,则使用字符串连接编写查询看起来非常难看并且容易出错。

13.PreparedStatement的限制是什么以及如何克服它?

PreparedStatement的一个限制是我们不能直接在IN子句中使用它。将PreparedStatement与IN子句一起使用的一些替代方法是:

执行单一查询 性能非常慢,不推荐使用

使用存储过程 特定于数据库,因此不适用于多个数据库应用程序。
动态创建PreparedStatement查询 良好的方法但失去了缓存的PreparedStatement的好处。

在PreparedStatement查询中使用NULL 当您知道变量输入的最大数量时,这是一种很好的方法,可以通过部分执行来扩展以允许无限制的参数。可以在JDBC PreparedStatement IN子句替代中找到更详细的分析。

14.什么是JDBC ResultSet?

JDBC ResultSet就像一个表示数据库结果集的数据表,通常通过执行查询数据库的语句来生成。

ResultSet对象维护指向其当前数据行的游标。最初,光标位于第一行之前。next()方法将光标移动到下一行。如果没有更多行,则next()方法返回false,并且可以在while循环中使用它来迭代结果集。

默认的ResultSet对象不可更新,并且只有一个向前移动的游标。因此,您只能迭代一次,并且只能从第一行到最后一行。可以使用以下语法生成可滚动和/或可更新的ResultSet对象。

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
当生成它的Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭。

我们可以使用ResultSet getter方法,列名或索引号从1开始检索列数据。

15.ResultSet有哪些不同的类型?

在创建Statement时,我们可以根据用户输入获得不同类型的ResultSet对象。如果您将查看Connection方法,您将看到createStatement()和prepareStatement()方法被重载以提供ResultSet类型和并发作为输入参数。

ResultSet对象有三种类型。

ResultSet.TYPEFORWARDONLY:这是默认类型,游标只能在结果集中向前移动。

ResultSet.TYPESCROLLINSENSITIVE:游标可以前后移动,结果集对创建结果集后其他人对数据库所做的更改不敏感。

ResultSet.TYPESCROLLSENSITIVE:游标可以向前和向后移动,结果集对创建结果集后其他人对数据库所做的更改很敏感。基于并发性,有两种类型的ResultSet对象。

ResultSet.CONCURREADONLY:结果集是只读的,这是默认的并发类型。

ResultSet.CONCUR_UPDATABLE:我们可以使用ResultSet更新方法来更新行数据。

16.Statement中的setFetchSize()和setMaxRows()方法有什么用?

我们可以使用setMaxRows(int i)方法来限制数据库从查询返回的行数。您可以使用SQL查询本身实现相同的功能。例如,在MySQL中,我们可以使用LIMIT子句来设置查询返回的最大行数。

理解fetchSize可能很棘手,因为你应该知道Statement和ResultSet是如何工作的。当我们在数据库中执行查询时,将在数据库缓存中获取并维护结果,并返回ResultSet。ResultSet是具有对数据库中结果的引用的游标。

假设我们有一个返回100行的查询,并且我们将fetchSize设置为10,因此在每次数据库访问时,JDBC驱动程序将只获取10行,因此将有10次访问以获取所有行。如果每行需要大量处理时间并且结果中的行数很大,那么设置最佳fetchSize会很有帮助。

我们可以通过Statement对象设置fetchSize,但可以通过ResultSet对象setFetchSize()方法覆盖它。

17.如何使用JDBC API调用存储过程?

存储过程是一组SQL查询,它们在数据库中编译,可以从JDBC API执行。JDBC CallableStatement可用于在数据库中执行存储过程。初始化CallableStatement的语法是;

CallableStatement
//我们需要在调用存储过程之前注册外部参数

stmt
我们需要在执行CallableStatement之前注册OUT参数。

18.什么是JDBC批处理,它有什么好处?

有时我们需要为数据库运行类似的批量查询,例如将数据从CSV文件加载到关系数据库表。我们知道我们可以选择使用Statement或PreparedStatement来执行查询。除此之外,JDBC API还提供了批处理功能,通过该功能,我们可以一次性为数据库执行大量查询。

JDBC API支持通过Statement和PreparedStatement addBatch()以及executeBatch()方法进行批处理。

批处理比一次执行一个语句更快,因为数据库调用的数量较少。

19.什么是JDBC事务管理?我们为什么需要它?

默认情况下,当我们创建数据库连接时,它以自动提交模式运行。这意味着无论何时执行查询并完成查询,都会自动触发提交。因此,我们触发的每个SQL查询都是一个事务,如果我们运行一些DML或DDL查询,则每个SQL语句完成后,更改都会保存到数据库中。

有时我们希望一组SQL查询成为事务的一部分,以便我们可以在所有查询运行正常时提交它们,如果我们得到任何异常,我们可以选择回滚作为事务的一部分执行的所有查询。

JDBC API提供了一种方法,setAutoCommit(boolean flag)通过该方法我们可以禁用连接的自动提交功能。我们应该仅在需要时禁用自动提交,因为除非我们在连接上调用commit()方法,否则不会提交事务。数据库服务器使用表锁来实现事务管理,这是资源密集型过程。所以我们应该在完成交易后立即提交交易。

20.如何回滚JDBC事务?

我们可以使用Connection对象rollback()方法来回滚事务。它将回滚事务所做的所有更改,并释放此Connection对象当前持有的所有数据库锁。

21.什么是JDBC Savepoint?如何使用它?

有时,事务可以是多个语句的组,我们希望回滚到事务中的特定点。JDBC Savepoint帮助我们在事务中创建检查点,并且我们可以回滚到该特定检查点。

为事务创建的任何保存点都会自动释放,并在提交事务时或在回滚整个事务时变为无效。将事务滚动回保存点会自动释放并使在相关保存点之后创建的任何其他保存点无效。

22.什么是JDBC DataSource?它的好处是什么?

JDBC DataSource是javax.sql包中定义的接口,它比DriverManager更强大,可用于数据库连接。我们可以使用DataSource来创建数据库连接,而Driver实现类可以用来获取连接的实际工作。除了获取数据库连接外,DataSource还提供了一些其他功能,例如:

缓存PreparedStatement以加快处理速度 连接超时设置 记录功能 ResultSet最大大小阈值 使用JNDI支持在servlet容器中连接池 在JDBC DataSource上阅读有关DataSource的更多信息。

23.如何在Apache Tomcat Server中使用JDBC DataSource和JNDI实现JDBC连接池?

对于部署在servlet容器中的Web应用程序,创建JDBC连接池非常简单,只需要几个步骤。

在容器配置文件中创建JDBC JNDI资源,通常是server.xml或context.xml。例如

server
在Web应用程序中,使用InitialContext查找在第一步中配置的JNDI资源,然后获取连接。

Context
24.什么是Apache DBCP API?

如果您使用DataSource获取数据库连接,通常用于获取连接的代码与特定于驱动程序的DataSource实现紧密耦合。除了选择DataSource实现类之外,大多数代码都是样板代码。

Apache DBCP通过提供DataSource实现来帮助我们摆脱这些问题,DataSource实现充当我们的程序和不同JDBC驱动程序之间的抽象层。Apache DBCP库依赖于Commons Pool库,因此请确保它们都在构建路径中。

25.什么是JDBC连接隔离级别?

当我们使用JDBC事务来实现数据完整性时,DBMS使用锁来阻止其他人访问事务所访问的数据。DBMS使用锁来防止脏读,不可重复读和幻像读问题。

DBMS使用JDBC事务隔离级别来使用锁定机制,我们可以通过Connection getTransactionIsolation()方法获取隔离级别信息,并使用setTransactionIsolation()方法设置它。

26.什么是JDBC RowSet?RowSet有哪些类型?

JDBC RowSet以更灵活的方式保存表格数据,即ResultSet。所有RowSet对象都是从ResultSet派生的,因此它们具有ResultSet的所有功能以及一些其他功能。RowSet接口在javax.sql包中定义。

RowSet提供的一些附加功能包括:

具有属性的Java Bean及其getter-setter方法。RowSet使用JavaBeans事件模型,它们可以向任何已注册的组件发送通知,用于事件,例如光标移动,更新/插入/删除行以及更改为RowSet内容。

默认情况下,RowSet对象是可滚动和可更新的,因此如果DBMS不支持可滚动或可更新的ResultSet,我们可以使用RowSet来获取这些功能。

RowSet大致分为两种类型:

已连接的RowSet对象 - 这些对象连接到数据库,与ResultSet对象最相似。JDBC API仅提供一个连接的RowSet对象javax.sql.rowset.JdbcRowSet,它的标准实现类是com.sun.rowset.JdbcRowSetImpl 断开连接的RowSet对象 - 这些RowSet对象不需要连接到数据库,因此它们更轻量级且可序列化。它们适合通过网络发送数据。有四种类型的断开连接的RowSet实现。

CachedRowSet - 它们可以获取连接并执行查询并读取ResultSet数据以填充RowSet数据。我们可以在数据断开连接时操作和更新数据,并重新连接到数据库并写入更改。WebRowSet派生自CachedRowSet - 它们可以读写XML文档。JoinRowSet派生自WebRowSet - 它们可以形成SQL JOIN而无需连接到数据源。从WebRowSet派生的FilteredRowSet - 我们可以应用过滤条件,以便只有选定的数据可见。

27.ResultSet和RowSet有什么不同?

RowSet对象派生自ResultSet,因此它们具有ResultSet的所有功能以及一些附加功能。RowSet的一大好处是它们可以断开连接,使其轻量级,并且易于通过网络传输。

是否使用ResultSet或RowSet取决于您的要求,但如果您计划使用ResultSet更长的持续时间,则断开连接的RowSet是释放数据库资源的更好选择。

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

一些常见的JDBC异常是:

java.sql.SQLException - 这是JDBC异常的基本异常类。java.sql.BatchUpdateException - 当Batch操作失败时抛出此异常,但它依赖于JDBC驱动程序是否抛出此异常或基本SQLException。java.sql.SQLWarning - 用于SQL操作中的警告消息。java.sql.DataTruncation - 当数据值因超出MaxFieldSize而被意外截断时。

29.JDBC中的CLOB和BLOB数据类型是什么?

字符大对象(CLOB)是由具有关联代码页的单字节字符组成的字符串。此数据类型适用于存储面向文本的信息,其中信息量可能超出常规VARCHAR数据类型的限制(上限为32K字节)。

二进制大对象(BLOB)是由字节组成的二进制字符串,没有关联的代码页。此数据类型可以存储大于VARBINARY(32K限制)的二进制数据。此数据类型适用于存储图像,语音,图形和其他类型的业务或特定于应用程序的数据。

30.什么是JDBC中的“脏读”?哪个隔离级别可防止脏读?

当我们处理事务时,有可能更新行,同时其他查询可以读取更新的值。这会导致脏读,因为更新后的值不是永久性的,已更新行的事务可以回滚到先前的值,从而导致无效数据。

隔离级别TRANSACTIONREADCOMMITTED,TRANSACTION_REPEATABLEREAD和TRANSACTIONSERIALIZABLE阻止了脏读。

31.什么是2阶段提交?

当我们在涉及多个数据库的分布式系统中工作时,我们需要使用2阶段提交协议。2阶段提交协议是分布式系统的原子承诺协议。在第一阶段,事务管理器向所有事务资源发送commit-request。如果所有事务资源都正常,则事务管理器将为所有资源提交事务更改。如果任何事务资源响应为Abort,则事务管理器可以回滚所有事务更改。

32.JDBC中有哪些不同类型的锁定?

从广义上讲,有两种类型的锁定机制可以防止数据损坏,因为多个用户使用相同的数据。

乐观锁定 - 使用代码实现此锁定。表中引入了一个额外的列以保持更新计数。当您选择该行时,您也会阅读此列,比如“version”。现在,当您尝试更新/删除行时,将在where子句中传递此“version”。因此,如果在其间执行其他线程的更新,则更新将失败。这是避免数据损坏的好方法,但如果有人错过更新其更新语句中的“version”,则可能容易出错。通过这种锁定方式,更新查询看起来如下所示。
mysql> update emp SET name = ‘David’, version = 5 WHERE id = 10 and version = 4;

悲观锁定 - 将记录从选择锁定到读取,更新和提交阶段。这通常由数据库供应商软件完成,并通过使用SELECT FOR UPDATE查询触发。如果线程处理锁定较长时间,则这种锁定行的方式可能导致性能降低和死锁。

除此之外,一些DBMS系统提供锁定机制来锁定单行,表或数据库。

33.你对DDL和DML语句有什么了解?

数据定义语言(DDL)语句用于定义数据库模式。创建,更改,删除,截断,重命名语句属于DDL语句,通常它们不返回任何结果。

数据操作语言(DML)语句用于操纵数据库模式中的数据。选择,插入,更新,删除,调用等是DML语句的示例。

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

java.util.Date包含有关日期和时间的信息,而java.sql.Date包含仅有关日期的信息,它没有时间信息。因此,如果您必须在数据库中保留时间信息,建议使用Timestamp或DateTime字段。

35.如何将图像或原始数据插入数据库?

我们可以使用BLOB将图像或原始二进制数据插入数据库。

36.什么是幻像读取以及哪种隔离级别阻止了它?

虚拟读取是指事务多次执行查询并获取不同数据的情况。假设事务正在执行查询以根据条件获取数据,然后另一个事务插入与条件匹配的行。现在,当同一事务再次执行查询时,新行将成为结果集的一部分。这个新行被称为Phantom Row,这种情况称为Phantom Read。

只有使用TRANSACTION_SERIALIZABLE隔离级别才能阻止幻像读取。

37.什么是SQL警告?如何在JDBC程序中检索SQL警告?

SQLWarning是SQLException的子类,我们可以通过在Connection,Statement和ResultSet对象上调用getWarnings()方法来检索它。SQL警告不会停止脚本的执行,但会警告用户警告。

38.如何使用数据库对象作为IN / OUT调用Oracle存储过程?

如果Oracle存储过程具有作为数据库对象的IN / OUT参数,那么我们需要在程序中创建相同大小的Object数组,然后使用它来创建Oracle STRUCT对象。然后我们可以通过调用setSTRUCT()方法为数据库对象设置此STRUCT对象并使用它。

39.我们什么时候得到java.sql.SQLException:找不到合适的驱动程序?

当SQL URL字符串格式不正确时,您将得到没有合适的驱动程序发现异常。您可以在使用DriverManager的简单Java应用程序或使用DataSource的JNDI资源中获取此异常。异常堆栈跟踪如下所示。

org
在调试此异常时,只需检查日志中打印的URL,如上面的日志中URL URL是’jdbc:mysql:// localhost:3306 / UserDB,而它应该是jdbc:mysql:// localhost:3306 / UserDB 。

40.JDBC有哪些最佳实践?

一些JDBC最佳实践是:

数据库资源很重,因此请确保在完成后立即关闭它。Connection,Statement,ResultSet和所有其他JDBC对象都定义了close()方法来关闭它们。
始终在代码中显式关闭结果集,语句和连接,因为如果您在连接池环境中工作,则可能会将连接返回到池,从而导致打开的结果集和语句对象导致资源泄漏。
关闭finally块中的资源,以确保即使在异常情况下它们也会关闭。
使用批处理进行类似的批量操作。
始终对Statement使用PreparedStatement以避免SQL注入并获得PreparedStatement的预编译和缓存优势。
如果要将批量数据检索到结果集中,则为fetchSize设置最佳值有助于获得良好的性能。
数据库服务器可能不支持所有隔离级别,因此请在假设之前进行检查。
更严格的隔离级别会导致性能降低,因此请确保为数据库连接设置了最佳隔离级别。
如果要在Web应用程序中创建数据库连接,请尝试使用JNDI上下文使用JDBC DataSource资源来重用连接。
当您需要长时间使用ResultSet时,请尝试使用断开连接的RowSet。

阅读全文

与jdbcdriver源码分析相关的资料

热点内容
正宗溯源码大燕条一克一般多少钱 浏览:917
电脑感染exe文件夹 浏览:916
wpsppt怎么转pdf格式 浏览:88
腾讯文档在线编辑怎么添加密码 浏览:868
本地不能访问服务器地址 浏览:865
访问服务器命令 浏览:835
华为云服务器分销商 浏览:954
Linux定位内存泄露 浏览:198
工程加密狗视频 浏览:720
不在内网怎么连接服务器 浏览:664
云服务器app安卓下载 浏览:966
如何查看linux服务器的核心数 浏览:137
交易平台小程序源码下载 浏览:148
程序员记笔记用什么app免费的 浏览:646
java与单片机 浏览:897
服务器内网如何通过公网映射 浏览:478
程序员穿越到宋代 浏览:624
怎么使用云服务器挂游戏 浏览:620
真实的幸福pdf 浏览:345
d盘php调用c盘的mysql 浏览:267