Druid连接池简述
在程序初始化时,预先创建指定数量的数据库连接对象存储在池中。当需要连接数据库时,从连接池中取出现有连接;使用完毕后,也不会进行关闭,而是放回池中,实现复用,节省资源。
连接池使用步骤
- 创建
database.properties
配置文件 - 引入druid-1.x.x.jar包
properties配置文件如下:
#连接设置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf8
username=root
password=123456
#<!-- 初始化连接 -->
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#最小空闲连接
minIdle=5
#超时等待时间,以毫秒为单位
maxWait=5000
初始化连接后面就是配置连接池的内容。
初始化连接数initialSize的值是连接池预先创建的连接对象个数;
最大连接数量maxActive的值是连接池创建的最大连接数,如果10个用完了就接着创建最多至50个。
最小空闲连接数minIdle的值是释放连接后的最小连接数,如果连接池中的对象太久没用就会自动做一个释放,最少保留5个。
超时等待时间maxWait指的是如果连接池中的50个对象都被拿出去了,那么想再次从连接池中获取就需要等待,如果5秒内还没有拿到连接则获取连接失败。
连接池使用演示
- 先创建一个工具类,该工具类用于提供获取连接池中的连接对象。
public class DbUtils {
//声明连接池对象
private static DruidDataSource ds;
static {
Properties properties =new Properties();
InputStream is=DbUtils.class.getResourceAsStream("/database.properties");
try {
properties.load(is);
//创建连接池
ds=(DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch ( Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
使用连接池时,就不再用类的forName方法来从配置文件中加载驱动,直接调用DruidDataSourceFactory类的createDataSource方法来创建连接池,该方法的参数是一个properties集合,返回一个DataSource,需要强转成
DruidDataSource。或获取连接对象时,调用连接池DruidDataSource对象的getConnection方法即可。
- 创建一个测试类,从池中拿取20个连接对象。
public class TestPool {
public static void main(String[] args) {
for(int i=0;i<20;i++) {
Connection connection=DbUtils.getConnection();
System.out.println(connection);
}
}
}
控制台打印结果如下:
com.mysql.jdbc.JDBC4Connection@769c9116
com.mysql.jdbc.JDBC4Connection@6aceb1a5
com.mysql.jdbc.JDBC4Connection@2d6d8735
com.mysql.jdbc.JDBC4Connection@ba4d54
com.mysql.jdbc.JDBC4Connection@12bc6874
com.mysql.jdbc.JDBC4Connection@de0a01f
com.mysql.jdbc.JDBC4Connection@4c75cab9
com.mysql.jdbc.JDBC4Connection@1ef7fe8e
com.mysql.jdbc.JDBC4Connection@6f79caec
com.mysql.jdbc.JDBC4Connection@67117f44
com.mysql.jdbc.JDBC4Connection@5d3411d
com.mysql.jdbc.JDBC4Connection@2471cca7
......
控制台打印了20个不同的连接对象,说明我们从不仅池中拿取了10个初始连接对象,还拿了后续连接池创建的10个对象。
在没有调用close方法时,每一个循环都新拿了一个连接对象。接下来在输出语句后面加一句connection.close()
,执行结果如下:
com.mysql.jdbc.JDBC4Connection@769c9116
com.mysql.jdbc.JDBC4Connection@769c9116
com.mysql.jdbc.JDBC4Connection@769c9116
com.mysql.jdbc.JDBC4Connection@769c9116
com.mysql.jdbc.JDBC4Connection@769c9116
com.mysql.jdbc.JDBC4Connection@769c9116
......
此时控制台的结果说明我们拿取了同一个连接池中的对象。需要说明的是,close方法并不是释放连接,而是将连接对象放回连接池中,所以在后续的循环中不必拿一个新的连接对象。进一步解释,在工具类中获取连接的代码return ds.getConnection();
中,getConnection返回的是一个DruidPoolConnection对象,该类型实现了Connection接口,并且重写了Connection中的close方法。
常见问题
-
控制台出现警告:
WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
翻译如下:
警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL5.5.45+、5.6.26+和5.7.6+的要求,如果不设置显式选项,则默认必须建立SSL连接。要让现有应用程序不使用SSL,需要将verifyServerCertificate属性设置为“false”。您需要通过设置useSSL=false显式禁用SSL,或者设置useSSL=true并提供用于服务器证书验证的信任库。
解决方法:
在配置文件中url键中加上useSSL=false。
url=jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf8&useSSL=false
-
控制台抛出异常
com.alibaba.druid.pool.DruidPooledConnection cannot be cast to com.mysql.jdbc.Connection
类型转换错误。Connection导错包了,导入
java.sql.Connection
就可以了。