使用步骤
- 导入相应jar包(下述以mysql驱动包为例)
- 添加配置文件 (配置文件必须放在src目录下)
- 编写对应工具类对数据库进行增删改查操作
1.DBCP连接池
DBCP(DataBase Connection Pool),[数据库连接池]。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
1.1导入相应jar包
mysql驱动包
commons-dbcp.jar
commons-pool.jar
commons-logging.jar 日志支持
1.2添加配置文件
dbcp.properties 使用时可直接直接以下属性copy到配置文件中
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxTotal=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWaitMillis=5000
1.3编写工具类DbUtils_DBCP
- 类加载器获取配置文件
- 参数传递配置文件,自动加载属性值,并生成连接池对象
- 编写方法返回连接池对象
public class DbUtils_DBCP {
private static BasicDataSource dataSource = null;
static {
try {
Properties properties = new Properties();
//类加载器获取配置文件
InputStream is = DbUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
properties.load(is);
is.close();
//参数传递配置文件,自动加载属性值
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//返回连接池对象
public static DataSource getDataSource(){
return dataSource;
}
}
测试代码:
因为在配置文件中设置最大连接数为50,所以超过50将不能再连接,除非前50个被释放
所以在链接使用完成后应该立即释放资源,将其重新放回到连接池中,以便被别人使用。
conn.close();//不代表关闭该连接对象,而是将连接对象归还给连接池
@Test
public void testGetDataSource(){
DataSource dataSource = DbUtils_DBCP.getDataSource();
for (int i = 0; i < 100; i++) {
try {
Connection conn = dataSource.getConnection();
System.out.println(i+"连接"+conn.hashCode()+"成功!");
conn.close();//不代表关闭该连接对象,而是将连接对象归还给连接池
} catch (SQLException e) {
// e.printStackTrace();
System.out.println("连接超时,请重新连接......");
}
}
}
2.C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
2.1导入jar包
c3p0-0.9.1.2.jar
mchange-commons-java-0.2.11.jar
mysql驱动包
2.2添加配置文件
c3p0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
c3p0.properties 注意:c3p0的配置文件其文件名不能改变
并且c3p0的配置文件属性都带前缀 c3p0.xx=xxx
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8
c3p0.user=root
c3p0.password=root
c3p0.acquireIncrement=5
c3p0.initialPoolSize=20
c3p0.minPoolSize=10
c3p0.maxPoolSize=50
c3p0.checkoutTimeout=5000
也可以用XML文件:
文件命名:c3p0-config.xml/c3p0.properties
<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">30</property>
<property name="maxPoolSize">50</property>
<property name="minPoolSize">5</property>
</default-config>
<!-- 命名的配置 -->
<named-config name="bj1805">
<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>
注意:
1: c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!
2:如果xml配置文件和属性文件都存在时,xml优先级高于属性文件
2.3编写工具类DbUtils_c3p0
c3p0不需要手动加载配置文件,在创建连接池是系统就回自动加载匹配文件及相应属性值
- 创建连接池对象
- 放回连接池对象
public class DbUtils_c3p0 {
private static ComboPooledDataSource dataSource = null;
static{
try {
dataSource = new ComboPooledDataSource();
} catch (Exception e) {
throw new RuntimeException("获取连接池失败!",e);
}
}
public static DataSource getDataSource(){
return dataSource;
}
}
测试代码:
因为在配置文件中设置最大连接数为50,所以超过50将不能再连接,除非前50个被释放
所以在链接使用完成后应该立即释放资源,将其重新放回到连接池中,以便被别人使用。
conn.close();//不代表关闭该连接对象,而是将连接对象归还给连接池
@Test
public void testGetDataSource(){
DataSource dataSource = DbUtils_c3p0.getDataSource();
for (int i = 0; i < 100; i++) {
try {
Connection conn = dataSource.getConnection();
System.out.println(i+"连接"+conn.hashCode()+"成功!");
conn.close();//不代表关闭该连接对象,而是将连接对象归还给连接池
} catch (SQLException e) {
// e.printStackTrace();
System.out.println("连接超时,请重新连接......");
}
}
}
3.Druid连接池(重点,必会)
Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一. 亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
五.丰富的社区
druid拥有丰富的社区,供大家学习
3.1导入jar包
druid-1.1.5.jar
3.2添加配置文件
druid.properties
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000
3.3编写工具类DbUtils_Druid
- 类加载器获取配置文件
- 参数传递配置文件,自动加载属性值,并生成连接池对象
- 编写方法返回连接池对象
public class DbUtils_Druid {
private static DruidDataSource dataSource = null;
static {
try {
//加载配置文件
Properties prop = new Properties();
InputStream is = DbUtils_Druid.class.getClassLoader().getResourceAsStream("druid.properties");
prop.load(is);
is.close();
//创建连接池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
//返回连接池对象
public static DataSource getDataSource(){
return dataSource;
}
}
测试代码:
因为在配置文件中设置最大连接数为50,所以超过50将不能再连接,除非前50个被释放
所以在链接使用完成后应该立即释放资源,将其重新放回到连接池中,以便被别人使用。
conn.close();//不代表关闭该连接对象,而是将连接对象归还给连接池
@Test
public void testGetDataSource(){
DataSource dataSource = DbUtils_Druid.getDataSource();
for (int i = 0; i < 100; i++) {
try {
Connection conn = dataSource.getConnection();
System.out.println(i+"连接"+conn.hashCode()+"成功!");
conn.close();//不代表关闭该连接对象,而是将连接对象归还给连接池
} catch (SQLException e) {
// e.printStackTrace();
System.out.println("连接超时,请重新连接......");
}
}
}
*****以上三种方式都可以使用硬编码方式将所有属性逐一设置,不让连接池对象自动加载,此处不做演示