-
JDBC数据库驱动注册与Connection获取源码分析
2018-12-14 09:08:37这是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(主要)
-
golang1.10.1基础库 - "database/sql" 数据库驱动注册机制
2018-08-03 10:29:45---------- 注册了驱动 { 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 } } } }
-
注册mysql数据库驱动_在web项目下注册MySQL数据库驱动失败
2021-01-19 08:40:13添加外部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:00DBC :是接口 驱动是接口的实现没有驱动无法完成连接数据库 ...1.注册驱动 告知JVM使用的是哪一个数据库的驱动 Class.forName("驱动"); 2.获得连接 使用JDBC中的类,完成对数据库的连接 Connection con =... -
JDBC 注册数据库驱动语句
2018-12-25 13:27:11初学JDBC,由于数据库软件的不同,我不能按着书上的来,网上找到了个挺全的注册语句。转载,原链接在这:http://www.cnblogs.com/Nbge/archive/2012/07/03/2574172.html MySQL: String Driver=... -
Access数据库驱动文件
2010-10-19 16:36:02Access数据库驱动文件,安装并注册它可以解决Access数据库操作问题,免除装OFFICE的痛苦。 -
Jdbc4.0版本自动加载注册数据库驱动是什么机制
2020-07-10 14:58:54答案:其使用了java的 SPI 机制,即你不需要用类似Class.forName()的代码注册JDBC驱动,DriverManager类将自动去查找项目jar中能用的数据库驱动来连接数据库。 SPI 机制:参考链接:... -
注册mysql数据库驱动_jdbc mysql数据库链接 及 三种不同的注册驱动的方式
2021-01-25 23:03:05注册驱动 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版本自动加载注册数据库驱动是什么机制?
2020-12-21 23:10:082020-12-21:Jdbc4.0版本自动加载注册数据库驱动是什么机制? 前言Jdbc4.0版本自动加载注册数据库驱动是什么机制? 前言 每日一题专栏 Jdbc4.0版本自动加载注册数据库驱动是什么机制? 其使用了java的SPI机制,即你... -
数据库驱动程序注册的写法问题
2012-11-05 13:08:17方法一 Class.forName(driverName); Connection conn = DriverManager.getConnection(url,user,psd); 方法二 Driver driver = (Dirver)Class.forName(driverName).new...这两种注册驱动器的效果一样吗?? -
【数据库学习笔记】(2)JDBC加载并注册数据库驱动并连接数据库
2014-09-15 14:20:59 -
注册数据库驱动的三种方式
2014-07-12 11:08:00驱动注册成功之后,基本上可以通过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 三种方式注册数据库驱动(转载)
2011-12-12 10:49:47使用JDBC的时候,有三种方法可以完成注册驱动的操作。 1. DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 使用这种方式注册不同的驱动,需要new不同的驱动类。具体的类名需要查看该数据库... -
在web项目下注册MySQL数据库驱动失败
2017-05-23 09:04:00经查验该错误的根源是MySQL的驱动未注册成功。 MySQL的Jar包未导入成功。需要将jar包导入到项目的lib目录下... 1.复制数据库jar包到项目的WEB-INF/lib目录下。 2.在MyEclipse中 右键lib -> Build Path -> ... -
替换jar包_平台数据库配置篇:数据库驱动JAR包的更新或新增
2021-01-12 05:26:19系统支持修改已经存在的数据库驱动包,也可以添加新的驱动。一、下载新的驱动包文件此节内容需要自行准备,您可以在数据库官方网站上下载最新的驱动 或者合适数据库版本的驱动包。二、替换旧的驱动包(新增驱动包)1... -
commons jar包_平台数据库配置篇:数据库驱动JAR包的更新或新增
2020-11-28 22:15:34系统支持修改已经存在的数据库驱动包,也可以添加新的驱动。一、下载新的驱动包文件此节内容需要自行准备,您可以在数据库官方网站上下载最新的驱动 或者合适数据库版本的驱动包。二、替换旧的驱动包(新增驱动包)1... -
JDBC数据库驱动使用步骤
2020-02-23 20:09:23文章目录一、添加JDBC驱动包二、使用JDBC简单步骤三、JDBC工具类(修改原有代码)四、JDBC的CRUD五、DAO模式六、JDBC Statement安全...1、注册驱动` DriverManager.registerDriver(new com.mysql.jdbc.Driver())... -
连接各种数据库驱动
2008-04-22 17:10:471、用数据库软件(如:mysql)创建数据库,在数据库注册时用到的数据库名则为刚刚创建的数据 库,若为数据源名,则需ODBC配置。 2、将驱动程序放在D:Tomcat 5.5commonlib或相应的开发工具的lib下, 对D:Tomcat ... -
烂笔头之使用数据库之前要先在项目中添加数据库驱动包
2014-02-01 16:02:54// 加载数据库驱动,注册到驱动管理器 String url = "jdbc:mysql://localhost:3306/db_database09"; // 数据库连接字符串 String username = "root"; // 数据库用户名 String pa -
不同数据库驱动的加载并向DriverManager注册
2012-09-14 19:57:51a.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 -
2021-1-20 加载数据库驱动的两种方法 反射和注册 (oracle)
2021-01-20 19:19:26static{ //加载驱动 try{ //方案一:反射加载驱动 // Class.forName(Myproperties.... //方案二:驱动注册 java.sql.DriverManager.registerDriver(new OracleDriver()); //有依赖,这个必须要有相应的类 ... -
java连接mysql数据库驱动包_关于java连接各种数据库所需的驱动包下载及相关类说明...
2021-01-27 02:04:24一、前言Java访问数据库使用最多连接方式是类型4本地协议驱动方式,在使用该方式连接数据库之前,需要先下载驱动包,然后将驱动包引入项目classpath路径下,然后再使用JDBC API进行数据库访问操作。1.注册JDBC驱动... -
不同数据库驱动的加载
2015-10-28 10:13:001、 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