数据库连接池
什么是数据库连接池:
数据库连接池就是系统预先为客户准备好的数据库的连接集合,集合内有多个连接,每当用户请求连接时系统就给该用户发放一个连接,用户用完后再归还给系统。
为什么要使用连接池:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
如何创建一个数据库连接池:
Java为连接池实现提供了一个规范(接口),规范的写法,我们需要实现DataSource接口,然后实现相应的方法即可。
一、自定义实现连接池
为了从本质上理解数据库连接池的实现原理,可以自定义实现一个连接池。
本连接池只是简单的实现了连接池的取得连接的功能,并为其添加了归还连接的方法,其他方法均未实现。
public class MyBdcp implements DataSource {
//定义线程安全的数据库连接集合
public static List<Connection> connList = Collections.synchronizedList(new ArrayList<>());
public static String driver = "com.mysql.jdbc.Driver";
public static String url = "jdbc:mysql://localhost:3306/emp";
public static String userName = "root";
public static String password = "root";
static {
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//向集合内添加10个数据库连接
try {
Connection conn = null;
for (int i = 0; i < 10; i++) {
conn = DriverManager.getConnection(url, userName, password);
connList.add(conn);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//取得一个连接,若池中没有连接了就返回一个null
@Override
public Connection getConnection() throws SQLException {
Connection conn = null ;
if (connList.size()>0) {
conn = connList.remove(0) ;
System.out.println("连接池中的连接数为:" + connList.size());
return conn ;
}
return null;
}
//交还连接,并将其添加到池中
public void result(Connection conn) {
connList.add(conn) ;
}
//以下方法均为实现
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}