//连接池操作(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);
}
}