JDBC学习(九、连接池技术)

一、数据库连接池

    普通的JDBC数据库连接(Connection对象)使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)----> 建立JDBC连接的开销(成本)是很多。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。
    数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。
      对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。
      这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.
连接池最大的好处: 重复利用了每一个Connection对象,节省了性能开销。


解决方案:把每次操作完的Connection对象,不要直接关闭,而是存储到缓冲区中,以供多次重复使用,下次需要再获取连接池对象,不是从DBMS中获取,而是直接从缓冲区中获取,释放Connection对象,就是归还于缓冲区中。--->数据库连接池



二、连接池概述

在Java中,连接池使用javax.sql.DataSource接口来表示连接池/数据源,注意:DataSource和JDBC一样仅仅只是一个接口,由各大服务器厂商来实现(Tomcat,JBoss等)。
常用的DataSource的实现:
    C3P0:  Hibernate推荐的,但是该连接池在07年之后就不再更新了,不建议使用:性能太太差了。
    DBCP:  Apache组织的项目,Spring推荐的.  真心不错。
    Druid:  阿里巴巴的项目(德鲁伊),世界上最好连接池。
DataSource(数据源)和连接池(Connection Pool)是同一个。
==================================================================
使用连接池和不使用连接池的区别在哪里?
获取连接对象:
没有连接池: 通过DriverManager来获取,直接和DBMS连接.
存在连接池:  直接通过连接池来获取连接对象.
              Connection conn = DataSource对象.getConnection();

释放连接对象:
没有连接池: conn.close():和数据库服务器(DBMS)断开连接。
存在连接池: conn.close():把Connection对象归还给连接池,并没有和DBMS断开。


三、DBCP连接池

环境准备:

    commons-dbcp-1.4.jar

    commons-pool-1.5.6.jar

链接:https://pan.baidu.com/s/1pc-i2nUEegx8R_zC48y6kw     密码:stlj

代码演示:

package com.hyxy.util;


import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;

public class DBCPUtils {
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	
	//创建连接池对象
	private static BasicDataSource bds = new BasicDataSource();
	static {
		try {
			InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
			//InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties");
			Properties prop = new Properties();
			prop.load(is);
			driver = prop.getProperty("driver");
			url = prop.getProperty("url");
			username = prop.getProperty("username");
			password = prop.getProperty("password");
			
			//设置连接池参数
			bds.setDriverClassName(driver);
			bds.setUrl(url);
			bds.setUsername(username);
			bds.setPassword(password);
			
			//初始化连接池数
			bds.setInitialSize(5);
			//最大活跃数
			bds.setMaxActive(8);
			//最大空闲数
			bds.setMaxIdle(4);
			//最小空闲数
			bds.setMinIdle(4);
			//最大等待毫秒数
			bds.setMaxWait(30);
			System.out.println(bds);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public static Connection getConn(){
		Connection conn = null;
		try {
			conn = bds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static void closeConn(Connection conn){
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void closeAll(Connection conn,Statement stat,ResultSet rs){
		try {
			if(conn!=null){
				conn.close();
			}
			if(stat!=null){
				stat.close();
			}
			if(rs!=null){
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		System.out.println(DBCPUtils.getConn());
	}
	
}


代码演示:

package com.hyxy.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.dbcp.DataSourceConnectionFactory;

public class DBCPUtils2 {
	//创建连接池对象
	private static DataSource bds;
	static {
		try {
			InputStream is = DBCPUtils2.class.getClassLoader().getResourceAsStream("dbcp.properties");
			//InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties");
			Properties prop = new Properties();
			prop.load(is);	
			bds = BasicDataSourceFactory.createDataSource(prop);
			System.out.println(bds);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConn(){
		Connection conn = null;
		try {
			conn = bds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){
		try {
			if(conn!=null){
				conn.close();
			}
			if(ps!=null){
				ps.close();
			}
			if(rs!=null){
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		System.out.println(DBCPUtils2.getConn());
	}
	
}


四、Druid连接池

Druid连接池(德鲁伊),阿里巴巴的连接池,号称世界上最好的连接池,https://github.com/alibaba/druid/wiki
Java语言领域性能最好的数据库连接池,类似于DBCP连接池。
环境准备:druid-1.0.15.jar

链接:https://pan.baidu.com/s/1jWtAjYxtEzFYHgMhE57CFg     密码:u4eh

Druid和DBCP的连接属性是完全相同的,创建连接池的对象不同。


代码演示:

package com.hyxy.util;


import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DruidUtils {
	//创建连接池对象
	private static DataSource bds;
	static {
		try {
			InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
			Properties prop = new Properties();
			prop.load(is);	
			//bds = BasicDataSourceFactory.createDataSource(prop);
			bds = DruidDataSourceFactory.createDataSource(prop);
			System.out.println(bds);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConn(){
		Connection conn = null;
		try {
			conn = bds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){
		try {
			if(conn!=null){
				conn.close();
			}
			if(ps!=null){
				ps.close();
			}
			if(rs!=null){
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		System.out.println(DruidUtils.getConn());
	}
	
}

代码结果:



Druid参数列表


猜你喜欢

转载自blog.csdn.net/qq_38741971/article/details/80716642