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