1.为什么要有连接池
之前每次用户来访问数据库,我们都会为这个用户创建一个连接。用户操作之后,这个连接就会关闭。如果以后还由用户来访问,我们还会给用户创建连接。这样频繁创建以及销毁连接对性能带来的影响是比较大的。
解决方式:我们可以预先创建很多的连接,把这个连接放到一个容器中。当用户来访问时,我们从容器中获取连接给用户使用,如果操作完后这个连接也不要关闭,再放回到容器中,这样就可以避免频繁创建以及销毁连接带来的性能问题。这个容器就是连接池。
连接池:就是一个容器,这个容器中预先保存了很多连接,用的时候直接从容器中获取连接,用完再放回去。
2.连接池的API
在JAVA中,有一个接口这个接口叫做javax.sql.DataSource,这个接口是连接池的根接口(规范),所有的连接池都会实现这个接口,在DataSource中有一个方法叫做getConnection,可以通过连接池获取连接。
3.连接池工具类
/*
连接池工具类。
提供的方法:
获取连接池的方法
获取连接的方法
释放资源(连接池中的连接调用close并不是关闭连接,而是归还连接
*/
public class DruidUtils {
private static DataSource dataSource = null;
//读取配置文件,以及创建连接池我们只做一次就可以了,所以可以放在静态代码块中
static {
try {
//创建Properties集合
Properties p = new Properties();
//从配置文件中读取数据库的四大信息
InputStream in = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
p.load(in);
//通过连接池工厂类调用createDataSource方法,根据Properties集合中的四大信息创建连接池
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
/*
定义方法,用来从连接池中获取连接
*/
public static Connection getConnection() throws SQLException {
Connection con = dataSource.getConnection();
return con;
}
/*
获取连接池(数据源)的方法
*/
public static DataSource getDataSource() {
return dataSource;
}
/*
定义方法,用来释放资源
*/
public static void close(Connection con, Statement st) {
close(con, st, null);
}
/*
定义方法,用来释放资源
*/
public static void close(Connection con, Statement st, ResultSet rs) {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
druid.properties如下
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
username=用户名
password=密码