zoukankan      html  css  js  c++  java
  • JDBC事务2

    Class.forName("com.mysql.jdbc.Driver");
    
    public class Driver extends NonRegisteringDriver implements java.sql.Driver { 
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());   //先执行DriverManager的初始化,再registerDriver方法,静态代码只走一次。
            }  
        }
    
    DriverManager类初始化:
    static {
            loadInitialDrivers();   //静态代码只走一次
        }
    private static void loadInitialDrivers() {
            String drivers;
            try {
                drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
                    public String run() {
                        return System.getProperty("jdbc.drivers");   //null
                    }
                });
            }  
            AccessController.doPrivileged(new PrivilegedAction<Void>() {
                public Void run() { 
                    ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);    //loadedDrivers  = java.sql.Driver接口
                    Iterator<Driver> driversIterator = loadedDrivers.iterator(); 
                    try{
                        while(driversIterator.hasNext()) {   //加载META-INF/services/java.sql.Driver,找到mysql-connector-java-5.1.45.jar!/META-INF/services/java.sql.Driver返回[com.mysql.jdbc.Driver, com.mysql.fabric.jdbc.FabricMySQLDriver]
                            driversIterator.next();
    //class com.mysql.jdbc.Driver反射出对象时候不会去执行java.sql.DriverManager.registerDriver(new Driver());因为上面已经走了一次,com.mysql.jdbc.Driver此时不在DriverManager的registeredDrivers里面,
    com.mysql.jdbc.Driver是在DriverManager静态代码执行完之后通过registerDriver方法加到registeredDrivers里面去的。
    //com.mysql.fabric.jdbc.FabricMySQLDriver反射时候去执行java.sql.DriverManager.registerDriver(new Driver());把自己加到DriverManager的registeredDrivers里面。但是DriverManager的静态代码不会执行。因为执行过一次。
                        }
                    } 
                    return null;
                }
            });  
        }
    public class FabricMySQLDriver extends NonRegisteringDriver implements Driver { 
        static {
            try {
                DriverManager.registerDriver(new FabricMySQLDriver());    //静态代码只走一次。
            }  
        }
    }
  • 相关阅读:
    前后端交互实现(nginx,json,以及datatable的问题相关)
    前端工作笔记
    系统前端基本文件+ajax部分理解
    python(day17)二分查找
    python(day16)内置函数,匿名函数
    day15(PYTHON)推导式{生成器,字典,列表,集合}
    Javascript 模拟 new
    Javascript call和apply的模拟实现
    Javascript——bind的模拟实现
    模拟Vue 中数据双向绑定
  • 原文地址:https://www.cnblogs.com/yaowen/p/12273232.html
Copyright © 2011-2022 走看看