仿写数据库连接池,简单的仿写,并不健壮,有助于自己去理解

//连接池操作(100个线程,10个连接)

100个线程用来插入数据库的操作,10个连接是初始化时候给连接池十个连接

下边是连接池类

package 数据库连接池我的练习;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class ConnctionPool {
	int size;//连接池大小
	List<Connection> cs = new ArrayList<>();
	
	public ConnctionPool(int size) {
		this.size = size;
		init();
	}
	void init() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			for (int i = 0; i < size; i++) {
				Connection c = DriverManager.getConnection(
						"jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=UTF-8",
						"root",
						"123");
				cs.add(c);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//获得连接的方法
	synchronized Connection getConnection(){
		while(cs.isEmpty()) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		Connection c = cs.remove(0);
		return c;
	}
	//回收连接的方法
	synchronized void returnConnection(Connection c){
		cs.add(c);
		this.notifyAll();
	}
}


下边写测试类,测试类中有写不用连接池的方法,我进行了对比,确实效率高些,高三倍左右吧,就以100条数据和我的电脑性能而言的,对比的普通方法有的辅助类没有写上

package 数据库连接池我的练习;

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

import com.mysql.jdbc.PreparedStatement;

import DAO.User;
import DAO.UserDAO;

public class TestPool {
	public static void main(String[] args) {
		//连接池操作(100个线程,10个连接)
		ConnctionPool cpool = new ConnctionPool(10);
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100; i++) {
			excuteThread e = new excuteThread("线程"+i, cpool);
			e.start();
			try {
				e.join();
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		Date d = new Date();
		long end = d.getTime();
		System.out.println("使用连接池插入100条数据用时间:"+(end - start));
		
		//普通操作(一百个线程,连接每次开启后关闭)
		Date d1 = new Date();
		long start1 = d1.getTime();
		for (int i = 0; i < 100; i++) {
			Insert insert = new Insert();
			insert.start();
			try {
				insert.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		Date d2 = new Date();
		long end2 = d2.getTime();
		System.out.println("普通操作时间:"+(end2 - start1));
	}
	
	
}

class excuteThread extends Thread{
	ConnctionPool cpool;
	
	public excuteThread(String name,ConnctionPool cpool) {
		super(name);
		this.cpool = cpool;
	}
	
	@Override
	public void run() {
		//获得连接
		Connection c = cpool.getConnection();
		String sql = "insert into user values(?,?,?)";
		System.out.println(this.getName()+"获得连接并执行任务");
		try (
			PreparedStatement ps =  (PreparedStatement) c.prepareStatement(sql);
			)
			{
			ps.setInt(1, 6);
			ps.setString(2, "周杰伦");
			ps.setInt(3, 38);
			
			//100个线程插入100条数据
			ps.execute();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//回收连接
		cpool.returnConnection(c);
	}
}

class Insert extends Thread{
	@Override
	public void run() {
		
		UserDAO userDao = new UserDAO();
		User user = new User(66, "小春", 38);
		userDao.add(user);
	}
	
}

猜你喜欢

转载自blog.csdn.net/dzz_bc/article/details/80209510