四种连接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)

四种连接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)   

一、环境 
   1、数据库驱动jar文件    

2、DBCP方法 
Commons-dbcp.jar:连接池的实现 Commons-pool.jar:连接池实现的依赖库 资源文件 
   3、c3p0方法: c3p0-0.9.1.2.jar 
配置文件:c3p0-config.xml 二、连接操作 1.DriverManager方法; import java.sql.Connection;   

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子类方法; 

资源文件DBConnection.properties    

driverClass = com.mysql.jdbc.Driver    
url = jdbc:mysql://localhost:3306/test  
username = root    
password = 123456

 
模拟数据连接池 

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有两种实现方式

1.直连数据库方式 
1.当调用DataSource.getConnection()时,其实它调用的是DriverManager.getConnection(url, user, password)来获取一个Connection,Connection使用完后被close,断开与数据库的连接,我们称这总方式是直连数据库,因为每次都需要重新建立与数据库之间的连接,而并没有把之前的Connection保留供下次使用.


2.池化连接方式 
1.可以说这种方式就是使用了连接池技术.DataSource内部封装了一个连接池,当你获取DataSource的时候,它已经敲敲的与数据库建立了多个Connection,并将这些Connection放入了连接池,此时调用DataSource.getConnection()它从连接池里取一个Connection返回,Connection使用完后被close,但这个close并不是真正的与数据库断开连接,而是告诉连接池"我"已经被使用完,"你"可以把我分配给其它"人"使用了.就这样连接池里的Connection被循环利用,避免了每次获取Connection时重新去连接数据库.
对DataSource的两种实现方式已经介绍完毕,现在知道DataSource与连接池之间的是关系而不是区别了吧,因为DataSource与连接池根本就不是同一类型的东西,只有同一类型的东西才存在区别,例如:oracle与db2都是数据库,它们才存在区别.

我们这里仅仅实现了数据库的链接,并没有池化链接

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。