Java个人总结——JDBC数据库连接池(二)
三种常见的数据库连接池
一、DBCP连接池
DBCP(DataBase connection pool),[数据库连接池]。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar 和 commons-pool.jar由于建立数据库连接是一个非常耗时的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
1 、DBCP连接池的使用
1.1 创建项目
创建JavaWeb项目-
1.2 导入相应jar包
mysql驱动包
commons-dbcp.jar
commons-pool.jar
commons-logging.jar 日志支持 1.3 硬编码使用DBCP
所谓的硬编码方式就是在代码中添加配置
public class DbcpTest2 {
@Test
public void test() {
//创建DBCP对象
BasicDataSource bds = new BasicDataSource() ;
//1.四个基本参数
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/emp");
bds.setUsername("root");
bds.setPassword("root");
//2.其他参数
//初始大小
bds.setInitialSize(10);
//最大空间
bds.setMaxTotal(50);
//最大空闲
bds.setMaxIdle(15);
//最小空闲
bds.setMinIdle(5);
//最大等待时间
bds.setMaxWaitMillis(5000);
try {
for (int i = 0; i < 100; i++) {
Connection conn = bds.getConnection();
System.out.println(conn + ".........." + i);
conn.close();//没有真的关闭,只是归还给连接池
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 1.4 软编码使用DBCP
所谓的软编码,就是在项目中添加配置文件,这样就不需要每次代码中添加配合!
-
项目中添加配置
文件名称: dbcp.properties
文件位置: src下
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxTotal=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWaitMillis=5000
代码实现
public class DbcpTest {
@Test
public void test() {
//加载属性文件
InputStream is = DbcpTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties pro = new Properties();
BasicDataSource bds = null ;
try {
pro.load(is);
//使用工厂获取数据库连接池对象
bds = BasicDataSourceFactory.createDataSource(pro) ;
for (int i = 0; i < 100; i++) {
Connection conn = bds.getConnection();
System.out.println(conn + ".........." + i);
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二、 C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0与dbcp区别
1.
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
2.
dbcp需要手动加载配置文件
c3p0自动加载
1、 使用步骤
1.1 创建项目
-
1.2 导入jar包
c3p0-0.9.1.2.jar
mchange-commons-java-0.2.11.jar
mysql驱动包 -
1.3.添加配置文件
c3p0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
文件位置: src
文件命名:c3p0-config.xml 和 c3p0.properties
使用配置文件:c3p0-config.xml
<!-- 该配置文件为固定格式,需要时直接复制使用即可,无需记忆 -->
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/school</property>
<property name="user">root</property>
<property name="password">root</property>
<!--扩展配置-->
<!-- 连接超过10秒报错-->
<property name="checkoutTimeout">10000</property>
<!--30秒检查空闲连接 -->
<property name="idleConnectionTestPeriod">30</property>
<!-- 初始大小 -->
<property name="initialPoolSize">10</property>
<!-- 每次增长的个数 -->
<property name="acquireIncrement">5</property>
<!-- 30秒不适用丢弃-->
<property name="maxIdleTime">20</property>
<property name="maxPoolSize">50</property>
<property name="minPoolSize">5</property>
</default-config>
<!-- 自己的配置,named-config name="自定义名称" -->
<!-- 程序调用时可以指定该自定义名称,若不指定,系统自动调用上面的默认配置 -->
<named-config name="my">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day2</property>
<property name="user">root</property>
<property name="password">111</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
</named-config>
</c3p0-config>
使用属性文件:c3p0.properties
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/school
c3p0.user=root
c3p0.password=root
c3p0.acquireIncrement=5
c3p0.initialPoolSize=20
c3p0.minPoolSize=10
c3p0.maxPoolSize=40
注意:
c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!
如果xml配置文件和属性文件都存在时,xml优先级高于属性文件
代码实现:
使用配置文件配置数据库连接池
public class C3p0Test2 {
@Test
public void test() {
//使用配置文件中的自定义配置,不写参数自动调用默认配置
ComboPooledDataSource cpds = new ComboPooledDataSource("my");
try {
//循环验证是否成功
for(int i=0; i<100; i++) {
//从连接池中获取连接
Connection conn = cpds.getConnection() ;
System.out.println(conn + "......" + i);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
同样,我们还可以使用硬编码的形式来配置C3P0
public class C3p0Test {
@Test
public void test() {
ComboPooledDataSource cpds = new ComboPooledDataSource() ;
try {
//1.四个基本参数
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/emp");
cpds.setUser("root");
cpds.setPassword("lvyifan");
//2.其他参数
//2.1设置初始池大小
cpds.setInitialPoolSize(10);
//2.2设置最大池大小
cpds.setMaxPoolSize(50);
//2.3设置最小池大小
cpds.setMinPoolSize(5);
//2.4设置等待时间
cpds.setCheckoutTimeout(5000);
//2.5连接池一次扩展的大小
cpds.setAcquireIncrement(5);
for(int i=0; i<100; i++) {
Connection conn = cpds.getConnection() ;
System.out.println(conn + "....." + i);
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由于此方法是代码显得臃肿,且不易维护,所以我们一般使用配置文件或属性文件的方式进行配置。
三、Druid连接池
Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一、亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二、实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三、可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四、多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
五、丰富的社区
druid拥有丰富的社区,供大家学习
使用步骤:
1、导入jar包
druid-1.1.5.jar2、配置文件 database.properties:
//连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
<!-- 初始化连接 -->
initialSize=10
//最大连接数量
maxActive=50
<!-- 最小空闲连接 -->
minIdle=5
<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000
实现代码:
public class DruitTest2 {
@Test
public void test() {
// 使用类加载器加载属性文件
InputStream is = DruitTest2.class.getClassLoader().getResourceAsStream("druid.properties") ;
Properties pro = new Properties() ;
try {
pro.load(is);
// 使用Druid连接池工厂实例化DruidDataSource接口
DruidDataSource dds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro) ;
for (int i = 0; i < 100; i++) {
Connection conn = dds.getConnection() ;
System.out.println(conn.getClass().getName() + "..." + i);
conn.close() ;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
上一篇: Spring使用Aspectj注解的方式来配置AOP
下一篇: 使用AspectJ实现AOP
推荐阅读
-
荐 Java——数据库编程JDBC之数据库连接池技术(C3P0与Druid,提供了Druid的工具类)
-
【⭐】Java—Spring-—数据库操作—使用内置连接池,报读取不到驱动错误。Could not load JDBC driver class。
-
JDCP连接池连接数据库报错:java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(
-
JAVA Web03——jdbc原理_使用Statement/PrepareStatement访问数据库_两种访问方式的区别_jdbc总结
-
数据库开发四:JDBC数据库开发进阶二(连接池)
-
Java个人总结——JDBC数据库连接池(二)
-
荐 Java——数据库编程JDBC之数据库连接池技术(C3P0与Druid,提供了Druid的工具类)
-
【⭐】Java—Spring-—数据库操作—使用内置连接池,报读取不到驱动错误。Could not load JDBC driver class。
-
JDCP连接池连接数据库报错:java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(
-
JAVA Web03——jdbc原理_使用Statement/PrepareStatement访问数据库_两种访问方式的区别_jdbc总结