1、Druid连接池
在程序初始化时,预先创建指定数量的数据库连接对象存储在池中,当需要连接数据库时,从连接池中取出,现有连接使用完毕后,也不会进行关闭,而是放回池中实现复用,节省资源.
1.1、Druid连接池使用步骤
- 在项目的lib文件夹里添加druid.jar文件
- 创建database.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/StudentManage?characterEncoding=utf-8&useSSL=false
username=root
password=root
#初始化连接数
initialSize=10
#最大连接数量
maxActive=50
#最小连接数量
minIdle=5
#超时等待时间以毫秒为单位
maxWait=3000
- 连接池工具类
public class DBUtils
{
//声明连接池对象
private static DruidDataSource ds;
static
{
Properties properties = new Properties();
try
{
//加载配置文件
properties.load(DBUtils.class.getResourceAsStream("/database.properties"));
//使用DruidDataSourceFactory创建连接池.createDataSource(),参数类型是Properties
ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
}
catch (IOException e)
{
e.printStackTrace();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
/**
* 从池中获取连接对象
* @return 连接对象
*/
public static Connection getConnection()
{
try
{
return ds.getConnection();
}
catch (SQLException sqlException)
{
sqlException.printStackTrace();
}
return null;
}
}
- 在main方法中测试,每次调用后就放回池中
for (int i = 0; i < 10; i++)
{
Connection conn = DBUtils.getConnection();
System.out.println(conn);
//将连接对象放回到池中
conn.close();
}
- 结果:
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
可以看到、用的都是一个对象,每次用完都放回到池中,下次用就再取,节省资源、实现复用。
- 注:这里边的conn.close()和Connection中close()不一样,不是释放资源,因为这里获取的conn是从连接池中获取的,在ds.getConnection()中按Ctrl键在getConnection()上边点击鼠标左键查看源码,可以看到一下代码:
public DruidPooledConnection getConnection() throws SQLException {
return this.getConnection(this.maxWait);
}
- 以同样方法再点击DruidPooledConnection可以看到:
public class DruidPooledConnection extends PoolableWrapper implements PooledConnection, Connection {
//........
}
可以看到、DruidPooledConnection实现了Connection接口,而以上循环中使用的conn.close()就是这里边的close(),可以说是被加工了,功能是将连接对象放回到池中,而不是释放掉。