DriverManager.getConnection Class.forName 详解

DriverManager.getConnection Class.forName 详解以前只是知道如果需要进行数据库连接,需要按照  Connectionconnection=null;  try{   Class.forName(“com.mysql.jdbc.Driver”);   try{    connection=DriverManager.getConnection(“jdbc:mysql://localhost:3306/pla

DriverManager.getConnection Class.forName 详解

以前只是知道如果需要进行数据库连接,需要按照
  Connection connection = null;

  try {

   Class.forName(“com.mysql.jdbc.Driver”);

   try {

     connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/platform”,”root”,”admin”);

    } catch (SQLException e) {

      System.out.println(“Problem getting connection”+ e);

    }
  } catch (ClassNotFoundException e) {

     System.out.println(“Couldn’t find driver”+e);

  } finally {

   try {

    if (connection != null) {

     connection.close();

    }

   } catch (SQLException e) {

     System.out.println(“Problem closing connection”+e);

   }

  }
 }
之后到底发生了什么不是很了解,今天查询了一下jdk的源代码,终于搞清楚了怎么回事,
在我们Class.forName的时候注册的是Driver的实现类,在API文档中如下写了Driver的作用

在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序”
那如何才能自动注册呢,有一点需要注意的就是Class.forName就可以注册,只能将注册信息添加到静态代码中,所有Driver代码的实现类中都采用了 
    static {

        try {

            DriverManager.registerDriver(new ProxoolDriver());

        } catch (SQLException e) {

            System.out.println(e.toString());

        }

    }
这种方式进行注册,这样在Class.forName的时候就会执行上面的代码,也就是向系统注册驱动程序,注册驱动程序就是他会组装DriverInfo后缓存到DriverManager中,便于后面进行处理。
然后开始取得数据库连接,这个时候他会匹配注册的所有的驱动,查询合适的驱动程序
    首先判断是否有加载驱动的权限,如果没有,匹配下一个.
    然后调用调用Driver的connect方法,如果返回null或者抛出异常,匹配下一个
    最后匹配到合适的驱动,调用驱动对象的connect方法进行连接,如果没有将会提示没有合适的驱动.
这就要求编写驱动的connect方法一开始最好进行url的有效性校验,只是处理自己要求的驱动url
注意采用了一个native的callerClassLoader来盘点是否有权限加载Driver
按照上面的原理我们可以自己写驱动程序了。

今天的文章DriverManager.getConnection Class.forName 详解分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/28410.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注