四种链接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)
1、环境
一、数据库驱动jar文件 java
二、DBCP方法
Commons-dbcp.jar:链接池的实现 Commons-pool.jar:链接池实现的依赖库 资源文件
三、c3p0方法: c3p0-0.9.1.2.jar
配置文件:c3p0-config.xml 2、链接操做 1.DriverManager方法; import java.sql.Connection;
mysql
package demo.jdbcpool.test1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { private static String driverClass = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/test"; private static String username = "root"; private static String password = "123456"; private static Connection conn = null; static { try { // 注册驱动 // 不要把conn = DriverManager.getConnection(url, username, password); // 放在这里。防止全部用户都用一个Connection Class.forName(driverClass); } catch (Exception e) { throw new RuntimeException(e); } } public static Connection getConnection() throws SQLException { conn = DriverManager.getConnection(url, username, password); return conn; } }
2.使用DataSource子类方法; sql
资源文件DBConnection.properties 数据库
driverClass = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/test username = root password = 123456
模拟数据链接池 oracle
DataSourcePool.java package cn.langzi.jdbc.DataSource; import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; import java.util.Properties; import javax.sql.DataSource; import javax.sql.DataSource; public class DataSourcePool implements DataSource { private static String url = null; private static String username = null; private static String password = null; private static int size = 10; private static LinkedList<Connection> list = new LinkedList<Connection>(); static{ try { InputStream in = DataSourcePool.class.getClassLoader() .getResourceAsStream ("cn/langzi/jdbc/DataSource/DBConnection.properties"); Properties prop = new Properties(); prop.load(in); Class.forName(prop.getProperty("driverClass")); url = prop.getProperty("url"); username = prop.getProperty("username"); password = prop.getProperty("password"); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } private static DataSourcePool pool = new DataSourcePool(); //建立对象就初始化size个数据库链接 private DataSourcePool(){ for(int i=0;i<size;i++){ try { Connection conn = DriverManager.getConnection(url, username, password); System.out.println(conn); list.add(conn); } catch (SQLException e) { e.printStackTrace(); } }
DataSource有两种实现方式url
1.直连数据库方式
1.当调用DataSource.getConnection()时,其实它调用的是DriverManager.getConnection(url, user, password)来获取一个Connection,Connection使用完后被close,断开与数据库的链接,咱们称这总方式是直连数据库,由于每次都须要从新创建与数据库之间的链接,而并无把以前的Connection保留供下次使用.code
2.池化链接方式
1.能够说这种方式就是使用了链接池技术.DataSource内部封装了一个链接池,当你获取DataSource的时候,它已经敲敲的与数据库创建了多个Connection,并将这些Connection放入了链接池,此时调用DataSource.getConnection()它从链接池里取一个Connection返回,Connection使用完后被close,但这个close并非真正的与数据库断开链接,而是告诉链接池"我"已经被使用完,"你"能够把我分配给其它"人"使用了.就这样链接池里的Connection被循环利用,避免了每次获取Connection时从新去链接数据库.
对DataSource的两种实现方式已经介绍完毕,如今知道DataSource与链接池之间的是关系而不是区别了吧,由于DataSource与链接池根本就不是同一类型的东西,只有同一类型的东西才存在区别,例如:oracle与db2都是数据库,它们才存在区别.xml
咱们这里仅仅实现了数据库的连接,并无池化连接对象