数据库注册两种方式的比较

在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里采用MySQL数据库),分别为:


DriverManager.registerDriver(new Driver());

Class.forName("com.mysql.jdbc.Driver");

  那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,


public static synchronized void registerDriver(java.sql.Driver driver)

throws SQLException {

if (!initialized) {

initialize();

}

DriverInfo di = new DriverInfo();

di.driver = driver;

di.driverClass = driver.getClass();

di.driverClassName = di.driverClass.getName();

// Not Required -- drivers.addElement(di);

writeDrivers.addElement(di);

println("registerDriver: " + di);

/* update the read copy of drivers vector */

readDrivers = (java.util.Vector) writeDrivers.clone();

}

  很明显,DriverManager将我们需要注册的驱动程序信息封装成DriverInfo放进了一个writeDrivers中,这个writeDrivers是DriverManager中声明的一个static类型Vector变量。在getConnection的时候会再用到。

  那么Class.forName("com.mysql.jdbc.Driver")是如何注册驱动程序的呢,我们知道Class.forName("类名")的主要作用是向虚拟机实例化一个Class实例,我们看一下com.mysql.jdbc.Driver的源代码。


public class Driver extends NonRegisteringDriver implements java.sql.Driver {

// ~ Static fields/initializers

// ---------------------------------------------

//

// Register ourselves with the DriverManager

//

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

  在 com.mysql.jdbc.Driver中有一段静态代码块,是向 DriverManager注册一个Driver实例。这样在 Class.forName("com.mysql.jdbc.Driver")的时候,就会首先去执行这个静态代码块,于是和DriverManager.registerDriver(new Driver())有了相同的效果。

  那么对于这两种方法,在这里,我推荐使用第二种,即Class.forName("类名")的方式。原因有两点

  1、在我们执行DriverManager.registerDriver(new Driver())的时候,静态代码块也已经执行了,相当于是实例化了两个Driver对象。

  2、 DriverManager.registerDriver(new Driver())产生了一种对MySQL的一种依赖。而Class.forName的方式我们完全可以在运行的时候再动态改变。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-21 17:59:12

数据库注册两种方式的比较的相关文章

实现JSP连接MySql数据库的两种方式

js|mysql|数据|数据库 当您面临JSP连接MySQL数据库问题,你首先需要在MySQL数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数据. 以下用两种方式来实现JSP连接MySql数据库 第一种方式,用JSP实现: <%@ page contentType="text/html; charset=gb2312" language="java"  import="java.sql.*

Java 连接Access数据库的两种方式_java

java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来程序部署的每个机器上都要进行设置不方面.所以现在不会使用啦. 2.JDBC java也可以和连接其他数据库一样连接MS Access,导入数据库相应的jar包,进行连接. 复制代码 代码如下: java Access JDBC jar包:Access_JDBC30.jar 具体连接,参考下面代码: 复制代

asp.net中读取数据库的两种方式

asp.net|数据|数据库 在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式,两者的差异如下: 使用Dataset对象读取数据大致需要以下5个步骤: (1)建立数据库链接,可以选用SQLConnection或者01edbConnection. (2)将查询保存在SQLDataAdapter或者oledbDataAdapter对象中. (3)使用DataAdapter对象的Fill方法将数据填充到DataSet中的DataTable中. (4)为Dat

不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置文件的密码,而实际上这个密码在代码中根本就没有使用,他们在代码中已经把用户验证信息写死.   在协助他们解决这个问题的时候,我看到他们代码中在和mongodb数据库交互时使用了已经不被建议使用的方法,于是便抽时间尝试了一下另一种被建议的方式实现各功能.   当然了,生产环境中用的是mongodb集群

php将字符串转化成date存入数据库的两种方式_php技巧

第一种方式 复制代码 代码如下: $date= date("Y-m-d",strtotime("2011-12-12")); 第二种方式 复制代码 代码如下: $date = "2011-12-12"; $year=((int)substr($date,0,4));//取得年份 $month=((int)substr($date,5,2));//取得月份 $day=((int)substr($date,8,2));//取得几号 $_date =

mysql下创建数据库的两种方式

mysql|创建|数据|数据库 1.命令创建 首先以root用户登录 sql>create database databasename; 2.如何你想在没登录mysql情况下创建mysql数据库,那在mysql的data目录下创建一个userbase目录即可.在连上mysql后,show databases;就可以看见你所创建的userbase库了 注:删除数据库 sql>drop database databasename;

SqlServer2008 数据库同步的两种方式(Sql JOB)

原文:SqlServer2008 数据库同步的两种方式(Sql JOB)   数据库同步是一种比较常用的功能.以下结合我自己的体会整理的,如果有理解不完全或者有误的地方望大牛不理赐教.下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中.特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作.可以在制定的时间时间作为任务计划自动执行.缺点是需要写SQL来进行操作.既然是数据库之间的同步就涉及

SqlServer2008 数据库同步的两种方式(发布、订阅使用方法)_mssql2008

上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别介绍发布.订阅的过程. 1.发布.发布需要用实际的服务器名称,不能使用服务器的IP地址进行.能发布的信息包括[表].[存储过程].[用户函数]如果使用IP会有错误,如下图:    具

实现oracle数据库字段自增长(两种方式)_oracle

程序猿都知道mysql等其他的数据库都有随着记录的插入而表ID会自动增长的功能,反而oracle却没有这一功能,下面通过两种方式来解决字段增长的功能,具体内容情况下文. 因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式. 复制代码 代码如下: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCAC