精华内容
下载资源
问答
  • 本篇文章主要介绍了详解Java动态加载数据库驱动,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Java数据库驱动程序加载及建立连接代码 包括数据库以下连接代码: //Oracle数据库 //DB2数据库: //SQL Server 2000数据库: //Sybase数据库: //MySQL数据库: //Informix数据库:
  • java规范怎么加载数据库驱动?

    千次阅读 2019-09-17 09:46:58
    class.forName与类加载机制有关,会触发执行com.mysql.jdbc.Driver类中的静态方法,从而使主类加载数据库驱动。 但是在最新的DriverManager源码中,可以不需要使用class.forName显示加载JDBC驱动程序,加了也没有...

    1、class.forName(“com.mysql.jdbc.Driver”)到底做了什么事?
    class.forName与类加载机制有关,会触发执行com.mysql.jdbc.Driver类中的静态方法,从而使主类加载数据库驱动。
    但是在最新的DriverManager源码中,可以不需要使用class.forName显示加载JDBC驱动程序,加了也没有问题

    2、为什么它的静态块没有自动触发?
    因为数据库驱动类的特殊性质,JDBC规范中明确要求Driver类必须向DriverManager注册自己,导致其必须由class.forName手动触发,这可以在java.sql.Driver中得到解释

    源码

    java建立数据库连接的方式
    以mysql驱动为例子,代码如下

    Class.forName("com.mysql.jdbc.Driver");//通过static静态块的加载,将对应的驱动存放到registeredDrivers 集合中
    String url = "jdbc:mysql://localhost:3306/database_name";
    String user = "root";
    Strign password = "root"
    //建立连接
    Connection conn = DriverManager.getConnection(url, user, password); //getConnection实际上只是遍历registeredDrivers 集合,然后去尝试连接而已
    

    以上连接分了两个阶段进行
    1、Class.forName(“com.mysql.jdbc.Driver”);
    通过类加载机制去加载mysql驱动包中的com.mysql.jdbc.Driver类,触发静态块代码的执行(static{})

    package com.mysql.jdbc;
    
    import java.sql.SQLException;
    
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    
        //即类加载的时候触发该静态块代码执行
        static {
            try {
                //向DriverManager注册本身
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
        public Driver() throws SQLException {
            // Required for Class.forName().newInstance()
        }
    }
    

    DriverManager是java提供的一个获取数据库连接的通用类,各厂商通过registerDriver将自己都扩展实现注册到一个线程安全都集合中(只需实现Driver接口,即可存)

    DriverManager.java
    
    public static synchronized void registerDriver(java.sql.Driver driver)
            throws SQLException {
            registerDriver(driver, null);
    }
    public static synchronized void registerDriver(java.sql.Driver driver,
                DriverAction da)
            throws SQLException {
            /* Register the driver if it has not already been added to our list */
            if(driver != null) {
                //将厂商都驱动包注册进集合中
                registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
            } else {
                // This is for compatibility with the original DriverManager
                throw new NullPointerException();
            }
            println("registerDriver: " + driver);
    }
    

    2、Connection conn = DriverManager.getConnection(url, user, password);建立连接
    在这里插入图片描述

    实际上获取connection的逻辑处理,只是去遍历集合,能够成功连接上数据库,则返回对应都连接,失败则忽略
    不会管你集合中注册了多少个数据库驱动,我从头到尾试一次,能成功都就返回

    //支持并发都list
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
    
    private static Connection getConnection(
        String url, java.util.Properties info, Class<?> caller) throws SQLException {
        for(DriverInfo aDriver : registeredDrivers) {    
             Connection con = aDriver.driver.connect(url, info);
             if (con != null) {
                  // Success!
                  println("getConnection returning " + aDriver.driver.getClass().getName());
                  return (con);
             }   
        }
    }
    

    :CopyOnWriteArrayList 支持高并发,在读都时候不会加锁,当插入,删除,更改操作都时候,拷贝一份副本去写入,然后再替换原来的集合,只允许一个线程去操作(加锁)

    优点:读无锁,效率高,适合读多写少的情况,例如配置、黑名单、物流地址等变化非常少的数据

    缺点:每次都要拷贝一份副本,占用内存,频繁GC。同时,只能保证最终的一致性,无法保证实时,因为在写入副本都同时,读的时旧副本

    展开全文
  • 内存中动态编译执行java代码

    热门讨论 2014-10-25 11:27:58
    不需要任何java类文件,将字符串输入到内存,然后编译,加载,执行,整个过程全部在内存中实现,不会产生.java和.class文件,做到了洁净无污染。
  • Java连接达梦DM数据的驱动包适合各种版本共有三个,以及连接达梦数据库的实例源码!
  • 1、加载JDBC驱动程序 2、提供JDBC连接的URL 3、创建数据库的连接 4、创建一个Statement 5、执行SQL语句 6、处理结果 7、关闭JDBC对象
  • 摘要:Java源码,初学实例,查询数据库 Java查询数据库,建立数据库连接的一系统代码演示,可以了解一下如何加载驱动器,获取连接,定义SQL查询语句,获取Statement对象,执行查询、遍历ResultSet、获取数据、在控制台...
  • 不停服热加载java代码

    千次阅读 2018-06-25 17:16:12
    我司自研的key-value数据库Xdb支持锁和事务,还是非常好用的,不过Xdb有一个问题就是死锁,尤其是频繁出现的死锁,基本上玩家啥都干不了了,只有重启.虽然程序员应该负责消灭所有死锁,但是这仅仅是理论上的可能.很多...

            我司自研的key-value数据库Xdb支持锁和事务,还是非常好用的,不过Xdb有一个问题就是死锁,尤其是频繁出现的死锁,基本上玩家啥都干不了了,只有重启.虽然程序员应该负责消灭所有死锁,但是这仅仅是理论上的可能.很多开发的task时间紧任务重,想要完美避免死锁很难. 不过xdb的这套体系也有两个优点:1逻辑和数据基本上是分离的,也就是说,不存在一个类即做逻辑又负责保存玩家数据;2 所有对数据的操作都通过Procedure来执行,而Procedure又有一个统一的入口方法Process.这使得热替换一个Procedure成为了可能.

    下面演示一下怎么写一个新的Procedure替换旧的,并在服务器开着的情况下加载执行:

    1.比如常用的加经验Procedure PAddExpProc,我想新写一个PAddExpProc2,来在线替换之前的PAddExpProc,第一步自然是新建一个Procedure的子类PAddExpProc2:


    注意PAddExpProc2类的构造函数跟之前的PAddExpProc不一样,因为每个Procedure的子类的构造函数的参数个数和类型都是不一样的,没有办法统一,比较好的办法就是把旧的PAddExpProc的实例传进来,然后新类自己初始化需要的参数.比如PAddExpProc2需要5个参数,这5个参数都可以通过反射从原来的procedure里面拿到:


    2.然后开始打包写好的类,可以自己用命令打,也可以用eclipse的输出功能,最后打好的jar包取名为hotdeploy.jar.这个jar的名字是在sys.properties文件中的sys.hotdeploy.jarfile属性配置的.

    3.接下来是怎么把jar包部署到外网上去.为了方便,没有搞一个新的流程,而是借用了已有的reload机制,通过xml指定要热加载的类,然后读取xml来实现类的热加载.

        3.1修改knight.gsp.main.HotfixConfig.xml文件,指定我们要加载的是哪个xml:


        这一步也可以不手写,通过修改f服务器热加载配置.xlsx,并打表提交文件来实现

        3.2然后就是修改knight.gsp.SystemSetting.SHotdeployClass.xml文件,把要替换的新类名和老类名写上:

        

    这一步也可以不手写,通过修改f服务器热加载配置Proc.xlsx并打表提交文件来实现:


    4.前面三步都完成之后就可以把jar包和那两个xml文件同步到服务器上(hotdeploy.jar是跟gsxdb.jar同目录的),执行reload脚本,

    reload脚本会启动新类的加载:

    4.1先写一个ClassLoader的子类:

     核心代码就是把jar包里的class都加载:


    4.2 这些加载的类都放入map中,并且设置标志位,这样不用每次都判断map是否empty:


    4.3当procedure真正执行的时候,先判断是否有新加载的类,如果有,优先执行新加载的:




     

    展开全文
  • java JDBC连接数据库步骤及代码

    万次阅读 多人点赞 2018-12-06 09:34:01
    在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现,成功加载后,会将Driver类的实例注册到DriverManager类中。...

    JDBC连接数据库,包含7个步骤

    (1)加载JDBC驱动程序   

        在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),   这通过java.lang.Class类的静态方法forName(String className)实现,成功加载后,会将Driver类的实例注册到DriverManager类中。

    代码如下:

    static{
    		try {
    			Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
    			}
    		catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}

    (2)提供JDBC连接的URL

        书写形式:协议:子协议:数据源标识   。 其中:

         协议:在JDBC中总是以jdbc开始 。子协议:是桥连接的驱动程序或是数据库管理系统名称。   数据源标识:标记找到数据库来源的地址与连接端口。

    代码如下:

    //连接MySql数据库,用户名和密码都是root   
         String url = "jdbc:mysql://localhost:3306/test" ;    
         String username = "root" ;   
         String password = "root" ;   

    (3)创建数据库的连接   

    代码如下:

     public static Connection getConn(){
        	 Connection conn = null;
        	 try {
        		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root","root");//连接数据库	
        		 }
             catch(SQLException e){
        		 e.printStackTrace();
        	 }
        	 return conn;
     }

    (4)创建一个Statement

        要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:

    •     执行静态SQL语句。通常通过Statement实例实现。
    •     执行动态SQL语句。通常通过PreparedStatement实例实现。
    •     执行数据库存储过程。通常通过CallableStatement实例实现。

    代码如下:

     public static Statement getStmt(Connection conn){
    	   Statement stmt = null;
    	   try {
    		stmt = conn.createStatement();
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	   return stmt;
       }

    (5)执行SQL语句

        Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate   和execute  

    •     ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句   ,返回一个结果集(ResultSet)对象。
    •     int executeUpdate(String sqlString):用于执行INSERT、UPDATE或   DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等  
    •     execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的   语句。

    代码如下:

     public static ResultSet executeQuery(Statement stmt,String sql){
    	 ResultSet rs = null;
    	 try {
    		rs = stmt.executeQuery(sql);
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	return rs; 
     }
     

    (6)处理结果   

        两种情况:  

    •     执行更新返回的是本次操作影响到的记录数。  
    •     执行查询返回的结果是一个ResultSet对象。  

         ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。

        使用结果集(ResultSet)对象的访问方法获取数据,代码如下:

    while(rs.next()){             
        String name = rs.getString("name") ;        
        String pass = rs.getString(1) ; // 此方法比较高效         
    }

    (7)关闭JDBC对象

        操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:

    •     关闭记录集
    •     关闭声明  
    •     关闭连接对象

    代码如下:

    //关闭结果集
     public static void closeRs(ResultSet rs){
    	   try {
    			if(rs != null ){
    				 rs.close();
    				 rs = null;
    			   }
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} 
     }
    //关闭执行方法
     public static void closeStmt(Statement stmt){
    	   try {
    			if(stmt != null ){
    				 stmt.close();
    				 stmt = null;
    			   }
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} 
    	   
       }
    //关闭连接
     public static void closeConn(Connection conn){
    	   try {
    		if(conn != null ){
    			 conn.close();
    			 conn = null;
    		   }
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
     }

    JDBC连接数据库工具类代码

    package com.njau.allnetitem;
    
    import java.sql.*;
    
    public class DB {
    	static{
    		try {
    			Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
    			}
    		catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    	
     private DB() {}
     
     public static Connection getConn(){
        	 Connection conn = null;
        	 try {
        		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_baima", "root","123456");//连接数据库	
        		 }
             catch(SQLException e){
        		 e.printStackTrace();
        	 }
        	 return conn;
     }
     
     public static void closeConn(Connection conn){
    	   try {
    		if(conn != null ){
    			 conn.close();
    			 conn = null;
    		   }
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
     }
       
     public static Statement getStmt(Connection conn){
    	   Statement stmt = null;
    	   try {
    		stmt = conn.createStatement();
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	   return stmt;
       }
       
     public static PreparedStatement getPStmt(Connection conn,String sql){
    	   PreparedStatement pstmt = null;
    	   try {
    		pstmt = conn.prepareStatement(sql);
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	   return pstmt;
       }
       
     public static void closeStmt(Statement stmt){
    	   try {
    			if(stmt != null ){
    				 stmt.close();
    				 stmt = null;
    			   }
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} 
    	   
       }
       
     public static ResultSet executeQuery(Statement stmt,String sql){
    	 ResultSet rs = null;
    	 try {
    		rs = stmt.executeQuery(sql);
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	return rs; 
     }
     
     public static void closeRs(ResultSet rs){
    	   try {
    			if(rs != null ){
    				 rs.close();
    				 rs = null;
    			   }
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} 
     } 
     
     public static ResultSet executeQuery(Connection conn,String sql){//重载
    	 ResultSet rs = null;
    	 try {
    		rs = conn.createStatement().executeQuery(sql);
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	return rs;  
       } 
     }

    工具类使用说明代码

    //插入数据
    public static void saveinfo(Object[] data) throws ParseException{
    	Connection conn = null;
    	PreparedStatement pstmt = null;
    try {
        conn= DB.getConn();
    	String sql = "insert into information value (null,?,?,?,?,?,?,?) ";
        pstmt = DB.getPStmt(conn, sql);
    	pstmt.setString(1,(String) data[0]);
    	pstmt.setString(2, (String) data[1]);
    	pstmt.setString(3,(String) data[2]);
    	pstmt.setString(4,(String) data[3]); 
    	pstmt.setString(5,(String) data[4]);
    	pstmt.setString(6,(String) data[5]);
    	pstmt.setTimestamp(7 ,(Timestamp)data[6]);
    	pstmt.executeUpdate();
    	} 
    	catch (SQLException e) {
    		e.printStackTrace();
    	}
        finally{
        	DB.closeStmt(pstmt);
        	DB.closeConn(conn);
        }
    }

    参考:

    http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html

    表示感谢!!

    展开全文
  • java se数据库驱动加载方法

    千次阅读 2017-03-15 22:52:23
    2. 在eclipse创建一个java se项目,在项目的目录创建lib目录,把dtds-1.2.2.jar文件拷贝到目录中 3.在eclipse中按F5刷新一下即可看到lib的目录。 4.右键点击lib目录选择“构建路径build path”->配置构建...

    1.下载jtds-1.2.2.jar

    https://sourceforge.net/projects/jtds/files/

    2. 在eclipse创建一个java se项目,在项目的目录创建lib目录,把dtds-1.2.2.jar文件拷贝到目录中

    3.在eclipse中按F5刷新一下即可看到lib的目录。

    4.右键点击lib目录选择“构建路径build path”->配置构建路径

    5.点击“添加JAR”

    6.点击“应用”,“确定”

    源代码参考

    package e20_01;
    import java.sql.*;
    public class Conn {
    	Connection con;
    	public Connection getConnection(){
    		try{
    			Class.forName("net.sourceforge.jtds.jdbc.Driver"); //数据库驱动加载
    			System.out.println("数据库驱动加载成功");
    		}catch(ClassNotFoundException e){
    			e.printStackTrace();
    		}
    		try{
    			con=DriverManager.getConnection("jdbc:jtds:"+
    		           "sqlserver://localhost:1433/db_jdbc","sa","");//数据库连接
    		System.out.println("数据库连接成功");
    		}catch(SQLException e){
    			e.printStackTrace();
    		}
    		return con;
    	}
    	public static void main(String[] args){
    		Conn c=new Conn();
    		c.getConnection();
    	}
    
    }
    

    
    

    展开全文
  • Java web 服务器连接MySQL数据库代码

    千次阅读 多人点赞 2020-03-16 17:23:42
    本文内容分为两部分,分别是java web连接MySQL数据库java web对数据库进行基本数据操作。附加代码
  • 在获取配置文件时可能无法获取到,但是抛出的是空指针异常,究其原因是未获取输入流的数据,即InputStream所获取的配置文件信息,此时应当明确自己构建的配置文件的路径是否与代码加载的路径 ...
  • import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq...
  • 数据库连接步骤加载驱动程序,获取数据库连接对象 2.1驱动jar包 2.2代码 package cn.sg.xx.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Main {...
  • 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM 这通过java.lang.Class类的静态方法forName(String className)实现 成功加载后,会将Driver类的实例注册到DriverManager类中 二、提供JDBC连接的URL: ...
  • 1.首先点击电脑的开始,找到SQL Server 配置管理器,将SQL Server网络配置中的SQLEXPRESS 的协议...2.新建一个数据库mydata,在数据库中建立一个表,并插入数据 --学生表 create table student( sno char(8) PRIM...
  • 本人使用的IDE是JetBrains家的Intellij IDEA, 相信网上有很多IDEA连接本地数据库的教程, 在这里就一笔带过不再截图分享. 首先是左上方View -&gt; Tool Windows -&gt; Database, 点击绿色加号选中第一个...
  • 一个毕业设计源代码Java酒店管理系统完整源代码,界面基于swing组件,使用一个可以动态加载一个图片做背景的JPanel,功能方面实现酒店管理系统的数据库增删修查等基础功能,里面有作者写的一些实用组件,包括一个...
  • 数据库(Oracle)触发器调用Java代码

    千次阅读 2017-11-29 15:39:14
    官方教程:https://docs.oracle.com/database/122/JJDEV/calling-Java-from-database-triggers.htm#JJDEV13286https://docs.oracle.com/cd/B19306_01/java.102/b14187/chthree.htm参考: ...
  • java多种方式连接不同的数据库(+关键代码),包括经典的jdbc驱动方式,jdbc-odbc方式和spring方式和hibernate等方式,有总结和实例,全面无误.
  •   工具:eclipse  MySQL5.6  MySQL连接驱动:mysql-connector-java-5.1.27...加载驱动:  1. 在工程目录中创建lib文件夹,将下载好的JDBC放到该文件夹下,如下图所示:    2. 右键工程名,在java build...
  • Java实战之Spring Boot入门到精通

    千人学习 2019-12-24 15:22:48
    包括如何基于Spring Boot2.0搭建一个企业级的多模块项目、整合Spring MVC和Mybatis实现项目中功能模块的CRUD,校验器Validator、Lombok、动态配置参数、开发环境切换、全局异常处理、定时任务、多线程、热加载、发送...
  • java代码, eclipse连接数据库

    千次阅读 2019-08-30 20:02:30
    java代码, eclipse连接数据库 eclipse 连接 MySQL 数据库的基本操作 1.jar文件 java代码要想操作数据库需要引入jar文件 jar文件是eclipse连接数据库的驱动文件. jar文件可在网上自行搜索下载. jar包下载地址...
  • java程序怎么连接数据库(添加数据库驱动) 在java连接数据库之前,需要先添加数据库驱动 准备工作 1.数据库的驱动包 2.Eclipse 1. 如图,打开Eclipse后,选择一个项目,在这个项目里新建一个文件夹,给这个文件夹...
  • 控制Java代码数据库中添加数据有四步:第一步加载驱动,第二步连接数据库,第三步创建PrepareStatement对象,第四步关闭资源 //下面是增加的方法 public void insert_data(){ //第一步加载驱动 try { Class.for...
  • java 连接数据库,三步骤 加载驱动 获得连接 创建数据库操作对象 创建查询返回的结果集 当你需要什么的时候,在相应的方法获取即可
  • java JDBC连接MYSQL链接数据库代码详解

    千次阅读 2019-03-09 10:20:10
    1.源代码 package mysqldatabase; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; public ...
  • 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 305,643
精华内容 122,257
关键字:

动态加载数据库的java代码

java 订阅