• JDBC4.0自动加载驱动器类


     1 JDBC4.0自动加载驱动器类
     2     从JDK1.6开始,Oracle就将修改了添加了新的加载JDBC驱动的方式。即JDBC4.0。在启动项目或是服务时,会判断当前classspath中的所的jar包,并检查META-INF目录下,是否包含services文件夹,如果包含,就会将里面的配置加载成相应的服务。
     3 如Oracle11g的ojdbc6.jar包:
     4 
     5 META-INF/services/jdbc.sql.Driver文件内容只有一行,即实现java.sql.Driver的类:
     6 oracle.jdbc.OracleDriver
     7 
     8 Oracle在随即发布的mysql-connector-java-5.1.8.jar中,也同样添加了上述的特性:
     9 
    10 里面的内容,也是一句,即:
    11 com.mysql.jdbc.Driver
    12 
    13 为了验证是否会自动加载数据库驱动类,我们书写一段Java代码:
    14 public static void main(String[] args) throws Exception {
    15         //从DriverManager中获取所有驱动类,遍历并输出
    16         Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
    17         while(en.hasMoreElements()){
    18             java.sql.Driver d = en.nextElement();
    19             System.err.println(d.toString());
    20         }
    21 }
    22 在MyEclipse或是Eclipse环境下,添加两个Jar包,分别为ojdbc6.jar的mysql-connector-5.1.8.jar:运行结果如下:
    23 sun.jdbc.odbc.JdbcOdbcDriver@173a10f
    24 oracle.jdbc.OracleDriver@e09713
    25 com.mysql.jdbc.Driver@1f1fba0
    26 可见,jdk1.6加载了三个驱动类。
    27 
    28 为了更好的验证此问题,我们再从命令行依次加载不同的jar包进行测试:
    29 第一次执行,没有指定任何的外部jar文件,可见只加载了系统的JdbcOdbcDriver:
    30 
    31 第二次执行:先设置ojdbc6.jar,即oracle的驱动包,可见已经自动加载了两个驱动类:
    32 
    33 第三次运行:再加载mysql-connector-java-5.1.18.jar(如果你用的是5.1.5你可以自己手工在jar包中的META-INF下建立一个services文件夹,然后建立一个java.sql.Driver文件,里面输入com.mysql.jdbc.Driver即可):注意以下代码中,使用%classpath%串联已经设置的classpath:
    34 
    35 
    36 需要说明的是,JDK6是一个聪明的设计。如果发现你已经注册过某个驱动,将不会再次为你注册这个驱动。除非你显式的调用了DriverManager.registerDriver(new SomeDriver())方法:
    37 以下是若干个测试:
    38     public static void main(String[] args) throws Exception {
    39         DriverManager.registerDriver(new Driver());//自己通过严重依赖的方式注册一个,不建议这样做
    40         Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
    41         while(en.hasMoreElements()){
    42             java.sql.Driver d = en.nextElement();
    43             System.err.println(d.toString());
    44         }
    45     }
    46 输出结果:
    47 sun.jdbc.odbc.JdbcOdbcDriver@66848c
    48 oracle.jdbc.OracleDriver@47b480
    49 com.mysql.jdbc.Driver@9931f5
    50 com.mysql.jdbc.Driver@19ee1ac
    51 
    52 测试代码2:
    53     public static void main(String[] args) throws Exception {
    54         Class.forName("com.mysql.jdbc.Driver");//即便是删除也会只注册一个
    55         Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
    56         while(en.hasMoreElements()){
    57             java.sql.Driver d = en.nextElement();
    58             System.err.println(d.toString());
    59         }
    60     }
    61 结果:
    62 sun.jdbc.odbc.JdbcOdbcDriver@66848c
    63 oracle.jdbc.OracleDriver@47b480
    64 com.mysql.jdbc.Driver@19ee1ac
  • 相关阅读:
    Linq查询操作之排序操作
    记一次docker机器无法访问本身的端口的错误2020-06-17
    prometheus监控docker的状态2020-06-17
    Docker RabbitMQ 重新启动时遇到错误
    Docker-Compose的地址与公司网络冲突
    MongDB自动运行脚本
    RabbitMQ内存泄露问题
    离线安装K3S Server(v1.17.4+k3s1)
    kubernetes yaml文件学习
    Docker Desktop启动Kubernetes
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4315664.html
Copyright © 2020-2023  润新知