• 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());    //静态代码只走一次。
            }  
        }
    }
  • 相关阅读:
    K3Cloud 解决方案版本号问题
    K3Cloud 通过元数据查询单据信息
    K3Cloud 设置分录的字段颜色
    K3Cloud 干预标准产品插件
    K3Cloud 根据单据ID 获取单据视图和数据包
    K3Cloud 后台修改账户密码策略
    K3Cloud 选择基础资料允许显示未审核数据
    K3Cloud 根据内码和基础资料元数据获取基础资料数据包
    按照应用场景划分安全测试
    常见业务场景的安全测试及安全开发
  • 原文地址:https://www.cnblogs.com/yaowen/p/12273232.html
Copyright © 2020-2023  润新知