• 浅析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


  • 相关阅读:
    jmeter之如何减负-实现稳定超高并发测试(性能调优)之正确添加监听器
    正则表达式批量处理数据
    Jmeter计数器实现自增功能
    Python自动化 unittest生成测试报告(HTMLTestRunner)03
    [leetcode 14]Longest Common Prfix
    [leetcode 13]Roman to integer
    [leetcode 12] Inter to Roman
    [leetcode 11]Container With Most Water
    [eetcode 10]Regular Expression Matching
    [leetcode 9]Palindrome Number
  • 原文地址:https://www.cnblogs.com/lshao/p/9645532.html
Copyright © 2020-2023  润新知