数据库连接池
什么是数据库连接池:
- 将多个连接对象放在一个类似于list的集合中,做到需要用到连接的时候就去池子中获取Connection连接对象,不用就放回池子中,不用频繁的获取连接池,关闭连接池.而是用时去池子中拿,不用就还回去
连接池的作用:
- 避免重复创建链接, 提升程序的执行效率
C3P0连接池
-
导包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.12.jar
https://mvnrepository.com,可以在maven网站去下载 -
配置C3P0配置信息
注意:配置文件名称一定要是:c3p0-config.xml,并且在src目录下
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://192.168.93.132:3306/jdbc</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<!--初始化的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
</c3p0-config>
--注意--
配置信息中的ip地址端口号,用户名,密码要和你mysql安装服务器的ip和用户名密码匹配
- 编写代码测试连接池以及连接数量
public class C3P0Test {
public static void main(String[] args) throws Exception{
//1.创建c3p0的数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();
//2.循环11次,从连接池中获取11次连接对象,看看是否有重复的,有,就说明是从池子中获取的连接对象
for(int i = 1; i <= 11; i++) {
Connection con = dataSource.getConnection();
System.out.println(i + ":" + con);
//当循环第5次的时候,把5次的这个连接对象还回连接池
if(i == 5) {
con.close();
}
}
}
}
运行结果
总结
由上面的代码案列得知,当循环到第5次获取连接对象的时候,就把链接对象还回给链接池了,后面链接就会拿到上一次还回去的对象,因为我们前面配置文件配置的是最大连接数量10,我们测试循环拿11次,如果不还回去就会报如下错误:因为最大连接数量是10,第11个获取 连接对象的时候发现池子里没有连接对象,就会等待我们上面配置文件中设置的多少时间.
关于C3P0就先了解到这里
druid连接池:
-
导包
去maven网站搜索druid下载复制在lib目录下导入即可
-
配置druid的配置文件(是properties配置文件)
在src目录下,名字随便取:我这里叫:druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.93.132:3306/jdbc
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数量
maxActive=10
# 超时时间
maxWait=3000
--注意--
配置信息中的ip地址端口号,用户名,密码要和你mysql安装服务器的ip和用户名密码匹配
3.编写代码测试:
我这里druid测试的话是执行一条查询语句,你也可以向上面一样测试下连接对象,获取超过了最大连接次数,然后看看有没有重复的对象
public class DruidTest {
public static void main(String[] args) throws Exception{
//1.通过连接池工具类获取一个数据库连接
Connection con = DataSourceUtils.getConnection();
//通过连接对象获取预编译语句对象
String sql = "SELECT * FROM student";
PreparedStatement pst = con.prepareStatement(sql);
//2.执行sql语句,接收结果集
ResultSet rs = pst.executeQuery();
//3.处理结果集
while(rs.next()) {
System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));
}
//4.释放资源
DataSourceUtils.close(con,pst,rs);
}
}
** 执行结果**