点击这里给我发消息 点击这里给我发消息

Java连结数据库内幕 

添加时间:2013-12-7
    相关阅读: 开发 数据库 程序 SQL

  Java.sql包中的 java.sql.Driver, jdbc.sql.Connection等提供给程序开发人员统一的开发接口,数据库提供商提供相应的实现,对程序开发人员来讲只要知道这些接口都有哪些方法就可以了。但我们可以深入一些看看到底这里面都做了那些事, 同时也可以学习其中的编程模式(如Interface模式等)。
  1、 Class.forName(String classname) 的源码为:
  public final
  class Class implements java.io.Serializable {
  ...
  public static Class forName(String className)
  throws ClassNotFoundException {
  return forName0(className, true, ClassLoader.getCallerClassLoader());
  }
  ...
  }
  关于forName0 请自己查看jdk source.
  的是把指定的Class装载到JVM中来。(注意class的装载、初始化过程)在装载过程中将执行被装载类的static块(如下)
  2 sun的JdbcOdbcDriver 源码:
  public class JdbcOdbcDriver extends JdbcOdbcObject
  implements JdbcOdbcDriverInterface
  {
  ...
  /**
  * connect to DB
  */
  public synchronized Connection connect(String s, Properties properties)
  throws SQLException
  {
  if(JdbcOdbcObject.isTracing())
  JdbcOdbcObject.trace("*Driver.connect (" + s + ")");
  if(!acceptsURL(s))
  return null;
  if(hDbc != 0)
  {
  disconnect(hDbc);
  closeConnection(hDbc);
  hDbc = 0;
  }
  if(!initialize())
  {
  return null;
  }
  else
  {
  JdbcOdbcConnection jdbcodbcconnection = new JdbcOdbcConnection(OdbcApi, hEnv, this); jdbcodbcconnection.initialize(getSubName(s), properties, DriverManager.getLoginTimeout());   jdbcodbcconnection.setURL(s);
  return
  jdbcodbcconnection;
    }
   }
   static
   {
  if(JdbcOdbcObject.isTracing())
   JdbcOdbcObject.trace("JdbcOdbcDriver class loaded");
   JdbcOdbcDriver jdbcodbcdriver = new JdbcOdbcDriver();
   try
   {
   DriverManager.registerDriver(jdbcodbcdriver);
   }
   catch(SQLException sqlexception)
   {
    if(JdbcOdbcObject.isTracing())
     JdbcOdbcObject.trace("Unable to register driver");
   }
   }
  }
  public interface JdbcOdbcDriverInterface
   extends Driver
   {
  ...
   }
  3 连接过程
  
  jdbc.sql.Connection con = DriverManager.getConnection("jdbc:odbc:pubs","sa","");
  
  public class DriverManager {
   public static synchronized Connection getConnection(String url,
    String user, String password) throws SQLException {
     java.util.Properties info = new java.util.Properties();
  
     // Gets the classloader of the code that called this method, may
     // be null.
     ClassLoader callerCL = DriverManager.getCallerClassLoader();
  
     if (user != null) {
      info.put("user", user);
     }
     if (password != null) {
      info.put("password", password);
     }
  return
  (getConnection(url, info, callerCL));
    }
  private static synchronized Connection getConnection(String url,java.util.Properties info, ClassLoader callerCL) throws SQLException
   {
  ...
    Connection result = di.driver.connect(url, info);
    ...
   }
   }
  4 结构图:
  
  
  
  
 
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册