浅析jdbc建立连接方式与背后的java类加载
关于jdbc的连接方式#1
Connection conn;
Class.forName("com.mysql.jdbc.Driver"); //2
conn=DriverManager.getConnection("jdbc:mysql://master/shao", USER, PASSWD);
关于java类加载的补充
1.java的类是动态加载的,加载一个类发生在访问类的静态成员,静态方法(构造函数隐式静态的)
2.Class对象:
类是程序的一部分,每个类都有一个Class对象,每编译一个类,就会产生一个Class对象(被保存在同名的class文件中).
所有的类都是对其第一次使用时动态加载到JVM中。类加载器首先检查这个类的Class对象是否已经加载,如果尚未加载,就会根据类名查找对应的.class文件将其加载。(与.java文件无关,因为运行java程序肯定是执行编译后的.class文件)
一旦某个类的Class对象在内存,就可以使用该Class对象创建该类的对象了。
————摘自java编程思想
3.我的理解是.class文件是一个类的描述的字节码,而Class对象是对应着的封装是类的信息的类型对象即Class对象,静态方法,静态成员,构造函数等都属于这个对象,当用其创建一个该类的对象后,这个对象就是jvm堆中的一个普通对象,含有成员属性和成员方法。
4.如何获取Class对象的引用
1.obj.getClass()
2.Class<OneClass> oc=OneClass.class;
3.Class<OneClass> oc=Class.forName("OneClass")
方法2与方法3
共同之处
2者都会从classpath寻找相应的类的字节码,即.class文件,并创建Class对象
不同
方法2采用延迟类初始化机制,类的静态变量和初始化块将在首次访问这个类的静态属性和方法时执行
,但是对编译器常量,即对static final XXX=XXX;指向的编译期常量不会触发初始化。方法3不会延迟初始化
5.Class.forName("com.mysql.jdbc.Driver"); //2
综上,这行代码加载了Driver类,并会执行初始化,再看Driver类的源码,
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
发现它在初始化阶段就已经向DriverManager注册了自己,Driver中有一行注释如下
The DriverManager will try to load as many drivers as it can find and then for any given connection request, it will ask each driver in turn to try to connect to the target URL.
#2
因此
new com.mysql.jdbc.Driver()和
Class.forName("....").newInstance()都是多余的,会创建多余的Driver对象
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
手动注册同样多余,会注册两个一样的Driver(因此调用构造函数时发生了类加载,执行了静态代码块
验证
Enumeration<java.sql.Driver> e=DriverManager.getDrivers();
while(e.hasMoreElements()) {
System.out.println(e.nextElement().getClass().getName());
}
输出
com.mysql.fabric.jdbc.FabricMySQLDriver
com.mysql.jdbc.Driver
com.mysql.jdbc.Driver
浅析jdbc建立连接方式与背后的java类加载的更多相关文章
- Orcal的JDBC数据连接方式
package cn.com.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...
- java基础-jdbc——三种方式加载驱动建立连接
String url = "jdbc:mysql://localhost:3306/student?Unicode=true&characterEncoding=utf-8" ...
- JDBC建立/关闭数据库连接
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- 转:ORACLE的JDBC连接方式:OCI和THIN
oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...
- JDBC纯驱动方式连接MySQL
1 新建一个名为MysqlDemo的JavaProject 2 从http://dev.mysql.com/downloads/connector/j/中下载最新的驱动包. 这里有.tar.gz和.z ...
- Java笔记4:JDBC纯驱动方式连接Oracle
JDBC纯驱动方式连接Oracle 1 下载Oracle提供的驱动程序包 下载地址: http://www.oracle.com/technetwork/database/enterprise-edi ...
- 数据库程序接口——JDBC——API解读第一篇——建立连接的核心对象
结构图 核心对象 Driver Java通过Driver接口表示驱动,每种类型的数据库通过实现Driver接口提供自己的Driver实现类. Driver由属性,操作,事件三部分组成. 属性 公共属性 ...
- Android跟蓝牙耳机建立连接有两种方式
Android 跟蓝牙耳机建立连接有两种方式. 1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后, BluetoothHeadsetService 会收 ...
随机推荐
- CSS 技巧汇总
CSS 选择符优先级 !important 声明>内联样式(style)>id 选择符(#id)>类选择符(.class)=伪类选择符(:hover )=属性选择符([attr] ) ...
- 在GitHub上分享自己的项目
GitHub主要是用作基于Git的分布式版本管理系统的库,可以保存和管理自己的代码,而且主要用作代码的合作开发. 注册GitHub后你就会有0.3G的免费空间,不过只能创建公开项目,这也满足代码分享的 ...
- Activity源码解析 - 读书笔记
1. Activity启动 Activity是一个比较好的模板方法模式.在Android系统启动时,第一个启动的进程是zygote进程,然后由zygote启动SystemServer,再后就是启动AW ...
- Node学习(二) --使用http和fs模块实现一个简单的服务器
1.创建一个www目录,存储静态文件1.html.1.jpg. * html文件内容如下: 12345678910111213 <html lang="en">< ...
- Maven使用和配置
Maven使用和配置 一.maven安装和概念 maven安装 maven编译(compile) 执行测试用例(test) maven打包(package) maven依赖管理 1.maven安装 官 ...
- 达拉草201771010105《面向对象程序设计(java)》第十周学习总结
达拉草201771010105<面向对象程序设计(java)>第十周学习总结 实验十 泛型程序设计技术 实验时间 2018-11-1 第一部分:理论知识 泛型:也称参数化类 ...
- APPium+Python+iOS屏幕滑动方法对比
最近在学习appium自动化,对iOS手机进行滑动操作进行总结: 1.mobile:scroll;该方法在实际使用调用时,会滚动2次.执行时间很长. 向下滚动整个屏幕driver.execute_sc ...
- 史上最全Beyond Compare中文文档.CHM (根据官网整理编辑)
截图如下: 下载地址: 链接:https://pan.baidu.com/s/1Ml98_biT1leXxGLr9fqI_w 提取码:p8jg
- 原生js中的常用方法的写法
1.js深度克隆的方法 //第一种 function deepClone(obj){ var str,newObj = obj instanceof Array? [] : {}; if(typeof ...
- angular的开始历程
开始写angular了,抑制不住的开心,比react差点开心,vue开始太虐 喜欢一个人要不要表个白?其实也没啥资格喜欢~!!考虑一段时间吧 9.29表白了,嗯,被拒绝的干脆利落 为他写了一首小诗歌, ...