关于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类加载的更多相关文章

  1. Orcal的JDBC数据连接方式

    package cn.com.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...

  2. java基础-jdbc——三种方式加载驱动建立连接

    String url = "jdbc:mysql://localhost:3306/student?Unicode=true&characterEncoding=utf-8" ...

  3. JDBC建立/关闭数据库连接

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  4. Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...

  5. 转:ORACLE的JDBC连接方式:OCI和THIN

    oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...

  6. JDBC纯驱动方式连接MySQL

    1 新建一个名为MysqlDemo的JavaProject 2 从http://dev.mysql.com/downloads/connector/j/中下载最新的驱动包. 这里有.tar.gz和.z ...

  7. Java笔记4:JDBC纯驱动方式连接Oracle

    JDBC纯驱动方式连接Oracle 1 下载Oracle提供的驱动程序包 下载地址: http://www.oracle.com/technetwork/database/enterprise-edi ...

  8. 数据库程序接口——JDBC——API解读第一篇——建立连接的核心对象

    结构图 核心对象 Driver Java通过Driver接口表示驱动,每种类型的数据库通过实现Driver接口提供自己的Driver实现类. Driver由属性,操作,事件三部分组成. 属性 公共属性 ...

  9. Android跟蓝牙耳机建立连接有两种方式

    Android 跟蓝牙耳机建立连接有两种方式. 1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后, BluetoothHeadsetService 会收 ...

随机推荐

  1. HTML笔记06--浮动第一章

    float --浮动 一 1.啥叫浮动? [使元素向左或向右移动,其周围的元素也会重新排列]简言之,就是让盒子并排. 通过float定义浮动 ---------- 未浮动样式代码如下: ------- ...

  2. C++走向远洋——62(项目二1、类模板)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. python爬虫-MongoDB安装配置

    MongoDB安装配置: 在安装配置MongoDB的过程中遇到了很多问题,现在重新梳理一遍安装流程.遇到的问题及其解决方法 系统版本:Windows 10 MongoDB版本:4.2.1 1.下载地址 ...

  4. Web中间件常见漏洞总结

    一.IIS中间组件: 1.PUT漏洞 2.短文件名猜解 3.远程代码执行 4.解析漏洞 二.Apache中间组件: 1.解析漏洞 2.目录遍历 三.Nginx中间组件: 1.文件解析 2.目录遍历 3 ...

  5. js 打开新窗口方式

    之前的项目,有个功能是下载文件,这里只要在浏览器输入 url 就会下载那个文件了.当时我只是简单得使用 window.open ,但是却会被浏览器进行拦截,要手动开启才行,然后就搜索研究其他方法,就看 ...

  6. createjs的compositeOperation在Android和IOS上接受的参数居然不一样

    例如 目标.compositeOperation = 如果是安卓? "darken" : "darker";

  7. JavaScript 工作原理之十三-CSS 和 JS 动画底层原理及如何优化其性能

    原文请查阅这里,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十三章. 概述 正如你 ...

  8. 在windows上极简安装GPU版AI框架(Tensorflow、Pytorch)

    在windows上极简安装GPU版AI框架 如果我们想在windows系统上安装GPU版本的AI框架,比如GPU版本的tesnorflow,通常我们会看到类似下面的安装教程 官方版本 安装CUDA 安 ...

  9. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  10. jinja2的url_for 和数据块

    1.静态文件引入:{{ url_for('static', filename='文件路径') }}   2.定义路由:{{ url_for('模块名.视图名',变量=参数) }}   3.定义数据块: ...