1、为什么需要数据库连接池
通过JDBC连接数据库时,首先要加载驱动,连接数据库,操作,释放连接。
存在一些问题:
a、JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求 一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。
b、对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。
c、这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
2、数据库连接池原理
可以通过Commons-pool2实现自己的连接池。
3、Druid数据库连接池使用
public class Demo05Druid {
public static void main(String[] args) throws Exception {
// Properties extends Hashtable<Object,Object> 实现了HaseTable接口,可以用来读取一些配置文件
Properties properties = new Properties();
// 不要通过具体路径去读,把配置文件当成有个资源getResourceAsStream
InputStream is = Demo05Druid.class.getClassLoader().getResourceAsStream("jdbc2.properties");
// load 函数的输入是一个流
properties.load(is);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
for(int i = 0 ; i<10 ; i++){
Connection conn1 = dataSource.getConnection();
System.out.println(i+"-------->"+conn1);
// 注意有close和没有close的区别
// conn1.close();
}
}
}
配置文件:利用DruidDataSourceFactory.createDataSource创建连接池时,配置项名称必须和官方文档保持一致。
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/fruitdb?useSSL=false&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
initialSize=2
maxActive=5
maxWait=5000