精华内容
下载资源
问答
  • 这是Mysql 8.x版的java驱动部分源码 package com.mysql.cj.jdbc; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { // // Register ourselves .....

    源码分析:

    这是Mysql 8.x版的java驱动部分源码

    package com.mysql.cj.jdbc;
    
    import java.sql.SQLException;
    
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        //
        // Register ourselves with the DriverManager
        //
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
        /**
         * Construct a new driver and register it with DriverManager
         * 
         * @throws SQLException
         *             if a database error occurs.
         */
        public Driver() throws SQLException {
            // Required for Class.forName().newInstance()
        }
    }
    

    通过在Driver里的static静态代码块调用java.sql.DriverManager.registerDriver()方法来注册数据库驱动.


    
    public class DriverManager {
    
        // List of registered JDBC drivers
        private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
        
        .... //省略代码
    }
    

    调用registerDriver后,驱动将会被添加到DriverManager的一个线程安全的List中(registeredDrivers)


    而当我们通过DriverManager.getConnection()来获得数据库连接时,会从这个list中去除第一个符合要求的driver,在调用driver.connect()获得一个Connection

    //  Worker method called by the public getConnection() methods.
        private static Connection getConnection(
            String url, java.util.Properties info, Class<?> caller) throws SQLException {
            /*
             * When callerCl is null, we should check the application's
             * (which is invoking this class indirectly)
             * classloader, so that the JDBC driver class outside rt.jar
             * can be loaded from here.
             */
            ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
            if (callerCL == null) {
                callerCL = Thread.currentThread().getContextClassLoader();
            }
    
            if (url == null) {
                throw new SQLException("The url cannot be null", "08001");
            }
    
            println("DriverManager.getConnection(\"" + url + "\")");
    
            ensureDriversInitialized();
    
            // Walk through the loaded registeredDrivers attempting to make a connection.
            // Remember the first exception that gets raised so we can reraise it.
            SQLException reason = null;
    
            //这里遍历已注册驱动
            for (DriverInfo aDriver : registeredDrivers) {
                // If the caller does not have permission to load the driver then
                // skip it.
                if (isDriverAllowed(aDriver.driver, callerCL)) {
                    try {
                        println("    trying " + aDriver.driver.getClass().getName());
                        //这里获得Connection
                        Connection con = aDriver.driver.connect(url, info);
                        if (con != null) {
                            // Success!
                            println("getConnection returning " + aDriver.driver.getClass().getName());
                            return (con);
                        }
                    } catch (SQLException ex) {
                        if (reason == null) {
                            reason = ex;
                        }
                    }
    
                } else {
                    println("    skipping: " + aDriver.getClass().getName());
                }
    
            }
    
            // if we got here nobody could connect.
            if (reason != null)    {
                println("getConnection failed: " + reason);
                throw reason;
            }
    
            println("getConnection: no suitable driver found for "+ url);
            throw new SQLException("No suitable driver found for "+ url, "08001");
        }
    

    总结:

    按Effective Java里的说法,这是服务提供者框架模式,服务接口是java.sql.Driver,提供者注册API是java.sql.DriverManager.registerDriver(),服务访问API是DriverManager.getConnection().这样做的好处是解耦,服务接收者与服务提供者完全解耦,服务接受者不许要指导服务提供者的具体内容即可调用其服务.


    欢迎访问我的 个人网站(主要), Github, CSDN(主要), 博客园, 简书, 掘金, 知乎, 微信公众号:HelloVant(主要)

    本文采用 知识共享 署名-非商业性使用-禁止演绎(CC by-nc-nd) 4.0 国际 许可协议 授权

    展开全文
  • ---------- 注册驱动 { func Register(name string, driver driver.Driver) { driversMu.Lock() defer driversMu.Unlock() if driver == nil { panic("sql: Register driver is nil...
    import (
        "strconv"
        "database/sql"
        {
        	import (
    			"context"
    			"database/sql/driver" // 文件 "database/sql/driver/driver.go" 定义接口 type Driver interface { ... }
    			"errors"
    			"fmt"
    			"io"
    			"reflect"
    			"runtime"
    			"sort"
    			"sync"
    			"sync/atomic"
    			"time"
    		)
        }
        _ "github.com/go-sql-driver/mysql" 
        // 文件 "github.com/go-sql-driver/mysql/driver.go" 
        {
        	import (
    			"database/sql"
    			"database/sql/driver"
    			"net"
    			"sync"
    		)
    
    		// ...
    
    		func init() {
    			// 文件 "database/sql/sql.go"
    			sql.Register("mysql", &MySQLDriver{}) // !!! ---------- 注册了驱动
    			{
    				func Register(name string, driver driver.Driver) {
    					driversMu.Lock()
    					defer driversMu.Unlock()
    					if driver == nil {
    						panic("sql: Register driver is nil")
    					}
    					if _, dup := drivers[name]; dup {
    						panic("sql: Register called twice for driver " + name)
    					}
    					drivers[name] = driver // 注入了驱动
    				}
    			}
    		}
        }
        "fmt"
        "time"
        "log"
    )
    
    
    
    db,_ = sql.Open("mysql", "super:Aa123456@tcp(127.0.0.1:3306)/test?charset=utf8")
    {
    	// 文件 "database/sql/sql.go"
    	func Open(driverName, dataSourceName string) (*DB, error) {
    		driversMu.RLock()
    		driveri, ok := drivers[driverName] // !!! ---------- 获取驱动
    		driversMu.RUnlock()
    		if !ok {
    			return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
    		}
    	
    		// driveri === &MySQLDriver{}
    		if driverCtx, ok := driveri.(driver.DriverContext); ok {
    			connector, err := driverCtx.OpenConnector(dataSourceName)
    			if err != nil {
    				return nil, err
    			}
    			return OpenDB(connector), nil
    		}
    
    	    // !!! ---------- 使用驱动
    		return OpenDB(dsnConnector{dsn: dataSourceName, driver: driveri}), nil
    		{
    			// 文件 "database/sql/sql.go"
    			func OpenDB(c driver.Connector) *DB {
    				ctx, cancel := context.WithCancel(context.Background())
    				db := &DB{
    					connector:    c,
    					openerCh:     make(chan struct{}, connectionRequestQueueSize),
    					resetterCh:   make(chan *driverConn, 50),
    					lastPut:      make(map[*driverConn]string),
    					connRequests: make(map[uint64]chan connRequest),
    					stop:         cancel,
    				}
    			
    				go db.connectionOpener(ctx) // 例程
    				go db.connectionResetter(ctx) // 例程
    			
    				return db
    			}
    		}
    	}
    	
    }

     

    展开全文
  • 添加外部jar包即可 在web项目下注册MySQL数据库驱动失败 标签:lte ror repo accesslog sso 读取 web thread jdbc 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:...

    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)

    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)

    at java.lang.Class.forName0(Native Method)

    at java.lang.Class.forName(Class.java:190)

    at RuquestDate.testMysql.doGet(testMysql.java:31)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)

    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)

    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)

    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)

    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)

    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)

    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at java.lang.Thread.run(Thread.java:745)

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)

    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)

    at java.lang.Class.forName0(Native Method)

    at java.lang.Class.forName(Class.java:190)

    at RuquestDate.testMysql.doGet(testMysql.java:31)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)

    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)

    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)

    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)

    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)

    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)

    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at java.lang.Thread.run(Thread.java:745)

    在web项目对数据进行读取后将数据存入数据库中报以上错误。。。经查验该错误的根源是MySQL的驱动未注册成功。

    MySQL的Jar包未导入成功。需要将jar包导入到项目的lib目录下...

    1.复制数据库jar包到项目的WEB-INF/lib目录下。

    2.在MyEclipse中 右键lib -> Build Path -> Configure Build Path... ->Add External ARs.. 添加外部jar包即可

    在web项目下注册MySQL数据库驱动失败

    标签:lte   ror   repo   accesslog   sso   读取   web   thread   jdbc

    本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

    本文系统来源:http://www.cnblogs.com/tongxuping/p/6892446.html

    展开全文
  • JDBC-注册数据库驱动

    千次阅读 2016-02-22 11:31:10
    偶尔会突然短路,想着为什么Class.forName(${DriverName}); DriverManager里就有注册了这个数据库的驱动呢?... 其实呢,注册数据库驱动这个动作,sun只提供了注册的动作,其余的是谁注册它并不关心,

    偶尔会突然短路,想着为什么Class.forName(${DriverName}); DriverManager里就有注册了这个数据库的驱动呢?


        这是因为,我们在思考 注册数据库驱动 的时候,总是想着我们自己去注册,如果没有显式的去做,就不自在。 这还是因为没有一个OO的思想。


        其实呢,注册数据库驱动这个动作,sun只提供了注册的动作,其余的是谁注册它并不关心,这样呢,它就是一个服务提供者,我提供注册的服务给你,你自己去注册就好了。


        就像加油站,我给加油站以及加油的龙头在那,你没油了你自己去拿着龙头加油。我不需要知道你这是桑塔纳还是水泥车还是宝马。


        sun提供给你这个接口,你们数据库提供商就自己拿去注册。


        下面是代码:


         sun提供的数据库驱动管理类:

       

    public static synchronized void registerDriver(Driver driver)
            throws SQLException
        {
            registerDriver(driver, null);
        }


        mysql提供的驱动类:(Class.forName()是让JVM去查找指定的类(初始化),并没有实例化,只不过是把类加载到了JVM中。但是由于静态代码和class是在方法区中的,在初始化的时候就会全部执行一次且以后不再执行,所以当初始化时,会加载以下代码中的static片段,即→注册数据库驱动方法)


    public class Driver extends NonRegisteringDriver
        implements java.sql.Driver
    {
    
        public Driver()
            throws SQLException
        {
        }
    
        static 
        {
            try
            {//mysql的驱动自己拿着sun的驱动管理类进行了注册。我们在使用的时候只要把这个类初始化就行了。
                DriverManager.registerDriver(new Driver());
            }
            catch(SQLException E)
            {
                throw new RuntimeException("Can't register driver!");
            }
        }
    }


    展开全文
  • java注册数据库驱动

    2020-12-06 17:15:16
    传统的使用jdbc来访问数据库的流程为: Class.forName(“com.mysql.jdbc.Driver”); String url = “jdbc:mysql://localhost:3306/test?user=root&password=123456″; Connection con = DriverManager.get...
  • 数据库驱动

    2018-10-16 12:24:00
    DBC :是接口 驱动是接口的实现没有驱动无法完成连接数据库 ...1.注册驱动 告知JVM使用的是哪一个数据库驱动 Class.forName("驱动"); 2.获得连接 使用JDBC中的类,完成对数据库的连接 Connection con =...
  • 初学JDBC,由于数据库软件的不同,我不能按着书上的来,网上找到了个挺全的注册语句。转载,原链接在这:http://www.cnblogs.com/Nbge/archive/2012/07/03/2574172.html MySQL: String Driver=...
  • Access数据库驱动文件

    热门讨论 2010-10-19 16:36:02
    Access数据库驱动文件,安装并注册它可以解决Access数据库操作问题,免除装OFFICE的痛苦。
  • 答案:其使用了java的 SPI 机制,即你不需要用类似Class.forName()的代码注册JDBC驱动,DriverManager类将自动去查找项目jar中能用的数据库驱动来连接数据库。 SPI 机制:参考链接:...
  • 注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); System.getProperty("jdbc.drivers","com.mysql.jdbc.Driver:oracle.jdbc.driver.OracleDriver"); Class.forName("com.mysql.jdbc.Driver")....
  • 2020-12-21:Jdbc4.0版本自动加载注册数据库驱动是什么机制? 前言Jdbc4.0版本自动加载注册数据库驱动是什么机制? 前言 每日一题专栏 Jdbc4.0版本自动加载注册数据库驱动是什么机制? 其使用了java的SPI机制,即你...
  • 方法一 Class.forName(driverName); Connection conn = DriverManager.getConnection(url,user,psd); 方法二 Driver driver = (Dirver)Class.forName(driverName).new...这两种注册驱动器的效果一样吗??
  • 驱动注册成功之后,基本上可以通过DriverManager.getConnection(url,user,password)来获取数据库的连接 try{  Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动  String url="jdbc:mysql://localhost...
  • access数据库驱动的安装方法

    千次阅读 2021-01-07 14:01:07
    是微软的64位Access2010数据库引擎可再发行程序包。 运行软件提示错误 :未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ,那么就需要安装这个软件了。 本程序的作用在于使得在office系统文件与office应用程序之间...
  • 使用JDBC的时候,有三种方法可以完成注册驱动的操作。 1. DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 使用这种方式注册不同的驱动,需要new不同的驱动类。具体的类名需要查看该数据库...
  • 经查验该错误的根源是MySQL的驱动注册成功。 MySQL的Jar包未导入成功。需要将jar包导入到项目的lib目录下...  1.复制数据库jar包到项目的WEB-INF/lib目录下。  2.在MyEclipse中 右键lib -> Build Path -> ...
  • 系统支持修改已经存在的数据库驱动包,也可以添加新的驱动。一、下载新的驱动包文件此节内容需要自行准备,您可以在数据库官方网站上下载最新的驱动 或者合适数据库版本的驱动包。二、替换旧的驱动包(新增驱动包)1...
  • 系统支持修改已经存在的数据库驱动包,也可以添加新的驱动。一、下载新的驱动包文件此节内容需要自行准备,您可以在数据库官方网站上下载最新的驱动 或者合适数据库版本的驱动包。二、替换旧的驱动包(新增驱动包)1...
  • 文章目录一、添加JDBC驱动包二、使用JDBC简单步骤三、JDBC工具类(修改原有代码)四、JDBC的CRUD五、DAO模式六、JDBC Statement安全...1、注册驱动` DriverManager.registerDriver(new com.mysql.jdbc.Driver())...
  • 连接各种数据库驱动

    2008-04-22 17:10:47
    1、用数据库软件(如:mysql)创建数据库,在数据库注册时用到的数据库名则为刚刚创建的数据 库,若为数据源名,则需ODBC配置。 2、将驱动程序放在D:Tomcat 5.5commonlib或相应的开发工具的lib下, 对D:Tomcat ...
  • // 加载数据库驱动注册到驱动管理器 String url = "jdbc:mysql://localhost:3306/db_database09"; // 数据库连接字符串 String username = "root"; // 数据库用户名 String pa
  • a.Class.forName("Com.ibm.db2.jdbc.app.DB2Driver"); b. Class.forName("Com.ibm.db2.jdbc.net.DB2Driver"); c. Class.forName("Com.microsoft.jdbc.sqlServer.SQLServerDriver); d. Class.forName("oracl.jd
  • static{ //加载驱动 try{ //方案一:反射加载驱动 // Class.forName(Myproperties.... //方案二:驱动注册 java.sql.DriverManager.registerDriver(new OracleDriver()); //有依赖,这个必须要有相应的类 ...
  • 一、前言Java访问数据库使用最多连接方式是类型4本地协议驱动方式,在使用该方式连接数据库之前,需要先下载驱动包,然后将驱动包引入项目classpath路径下,然后再使用JDBC API进行数据库访问操作。1.注册JDBC驱动...
  • 1、 Class.forName(...MySQL注册 url="jdbc:mysql://localhost:3306/test"; 2、Class.forName("Com.ibm.db2.jdbc.app.DB2Driver"); DB2注册 3、 Class.forName("Com.ibm.db2.jdbc.net.DB2

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,816
精华内容 1,926
关键字:

数据库驱动注册