数据库连接池的学习(一)——自定义数据库连接池

       使用JDBC操作数据库,需要建立Connection,使用传统的JDBC操作需要每次创建Connection,创建Connection是一个非常消耗性能和消耗时间的过程,我们需要在提高程序性能,那么就需要减少每次创建创建连接带来的负面影响,解决这个问题我们将利用池子概念,预先创建一些链接放入池子中,如果需要操作数据,不用创建新的Connection,只需要在池子中获取即可,使用完毕放入池子!这样就形成了复用!

       下面我们来自定义一个数据库连接池,因为存放数据库连接,所以,我们可以用一个集合去存放这些数据库连接,还应该有获取连接和回收连接的方法。

首先建立一个数据库test,并创建一张学生表:

CREATE TABLE `students` (
  `sid` varchar(8) NOT NULL,
  `sname` varchar(255) DEFAULT NULL,
  `gender` varchar(255) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

       

然后建立一个数据库的配置文件:db.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=1234

接着建立一个JDBCUtils,代码如下:

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class JDBCUtils {
	private static String driverClass;
	private static String url;
	private static String username;
	private static String password;
	
	//静态代码块
	static{
		try {
            //通过反射机制加载配置文件
			InputStream is = JDBCUtils.class.getResourceAsStream("/db.properties");
			Properties p = new Properties();
			p.load(is);
			driverClass = p.getProperty("jdbc.driverClass");
			url = p.getProperty("jdbc.url");
			username = p.getProperty("jdbc.username");
			password = p.getProperty("jdbc.password");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static Connection openConnection() {
		try {
			Class.forName(driverClass);
			Connection conn = DriverManager.getConnection(url, username, password);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

接下来就是自定义数据库连接池:

import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

/**
 * 数据库连接池
 * @author littledyf
 *
 */
public class DataSourcePool {
	//1.创建集合存放数据库连接
	private static LinkedList<Connection> list = new LinkedList<Connection>();
	//2.初始化数据库连接池
	static{
		for (int i = 0; i < 10; i++) {
			Connection conn = JDBCUtils.openConnection();
			list.add(conn);
		}
	}
	//3.从数据库连接池中获取一个对象
	public static Connection getConnection(){
		if(list.isEmpty()){
			Connection conn = JDBCUtils.openConnection();
			list.add(conn);
		}
		Connection conn =  list.removeFirst();
		return conn;
	}
	//4.使用完连接对象后,要把连接对象归还到连接池中
	public static void addBack(Connection conn){
		if(list.size() > 10){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			list.add(conn);
		}
	}
	//5.获取连接池中空闲连接的数量
	public static int getCount(){
		return list.size();
	}
}

测试:

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class DataPoolTest {
    @Test
    public void t() throws SQLException {
        Connection conn = DataSourcePool.getConnection();
        PreparedStatement ps = conn.prepareStatement("select * from students");
        ResultSet rs = ps.executeQuery();
        while(rs.next()){

            String sname = rs.getString("sname");
            System.out.println(sname);
        }
        System.out.println(DataSourcePool.getCount());
        //回收
        DataSourcePool.addBack(conn);
        System.out.println(DataSourcePool.getCount());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/82857620