今日内容
1. 数据库连接池
2. Spring JDBC : JDBC Template
1、数据库连接池
概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
好处
1. 节约资源
2. 用户访问高效
获取数据库连接其实就是向操作系统底层获取资源,这种获取资源的方式其实是十分耗时的。
实现:
1. 标准接口:DataSource javax.sql包下的
sun公司没有给DataSource接口提供实现类,DataSource接口由驱动程序供应商(既数据库厂商实现)实现。
1. 方法:
* 获取连接:getConnection()
* 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
2. 一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术
2. Druid:数据库连接池实现技术,由阿里巴巴提供的
C3P0:数据库连接池技术
步骤:
1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar(依赖jar包) ,
* 不要忘记导入数据库驱动jar包
2. 定义配置文件:
* 名称: c3p0.properties 或者 c3p0-config.xml(只有把配置文件命名成为这两个名字,系统才能找到)
* 路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接: getConnection
我们想使用别人提供的数据库连接池,别人是实现DataSource对象创建这个连接池的。我们首先需要导入别人的实现jar包,如这里导入了C3P0数据库连接池的2个jar包,这样我们就可以使用数据库连接池的功能。
(注意导入数据库驱动jar包,因为我们始终都是要获取数据库的连接,那么就必须要驱动数据库,那么就必须获取数据库驱动jar包),另外,需要注意导入的jar包必须添加到当前项目的类库(Add as library)。
其次,我们想要获取C3P0的jar包所提供的数据库连接,获取数据库连接对象有2种方法(如C3P0文档介绍),硬编码的形式(像之前一样获取连接)不推荐,还有一种是通过配置文件获取。文档说明如下:
Configuration files are normally looked up under standard names (c3p0.properties or c3p0-config.xml) at the top level of an application's classpath
配置文件一般命名为“c3p0.properties”或者“c3p0-config.xml”,且系统会自动在当前应用的classpath最顶层路径下面取寻找这两个文件,而我们的src包的路径会默认放到classpath下,因此我们将数据库连接池的配置文件放到src包的路径下即可,这样在使用的时候系统就能通过classpath找到配置文件。
这个配置文件就类似于我们之前所使用的“jdbc.properties”这个配置文件,同样是从配置文件来获取数据库连接,而我们所导入的C3P0的jar包,提供的是数据库连接池底层的实现。
接下来数据库连接池对象 ComboPooledDataSource,然后就可以获取数据库连接。
代码:
package lkj.test.C3P0Demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* c3p0的演示
*/
public class C3P0Demo1
{
public static void main(String[] args) throws SQLException
{
//我们导入C3P0的jar包以及数据库驱动包,并导入C3P0的配置文件之后,就可以开始获取数据库连接对象
//数据库注册驱动C3P0jar包以及配置文件已经在底层完成,我们这里可以直接使用CombopooledDataSource对象来获取数据库连接池的数据库连接对象。
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection con = ds.getConnection();
System.out.println(con);
//com.mchange.v2.c3p0.impl.NewProxyConnection@ba4d54 [wrapping: com.mysql.jdbc.JDBC4Connection@12bc6874]
}
}
接下来我们对配置文件c3p0-config.xml进行解析。
package lkj.test.C3P0Demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* c3p0-config.xml文件配置信息的验证
*/
public class C3P0Demo1
{
public static void main(String[] args) throws SQLException
{
testNamedConfig();
//验证连接池参数 ——最大的连接数量(这里会使用第一个默认配置)
//同样先创建数据库连接池对象(注意是DataSource不是DataSources)
// DataSource ds = new ComboPooledDataSource();
// for (int i = 0; i < 11; i++)
// {
// Connection con = ds.getConnection();
// //设置数据库连接池最大连接数量也10,全部获取到
// System.out.println(i+" : "+con);
//
// //如果我们尝试获取11个,获取到10个之后,等待延时3秒之后就会报错
// }
// for (int i = 0; i < 11; i++)
// {
// Connection con = ds.getConnection();
// System.out.println(i+" : "+con);
//如果我们想获取11个,我们可以用connection的close方法,归还连接
// if(i==5)
// {
//我们将i=5时的所获取的数据库连接归还给连接池,这样就可以第11次获取数据库连接
//注意,只在i=5时归还一个连接,因此没办法第12次获取
// con.close();//归还连接到连接池中
// }
// }
}
//named-config:匿名配置的验证
//多个配置使得我们可以在获取连接的时候使用不同的config配置,使得使用更加方便
public static void testNamedConfig() throws SQLException
{
//获取数据库连接池对象(使用匿名配置)
DataSource ds = new ComboPooledDataSource("otherc3p0");
for (int i = 0; i < 9; i++)
{
//匿名“otherc3p0”配置设置的最大连接数是8,尝试获取9个连接会报错
//使用的时候注意指定好数据库为db2
Connection con = ds.getConnection();
System.out.println(i + " : " + con);
}
}
}
Druid:数据库连接池实现技术,由阿里巴巴提供的
步骤:
1. 导入jar包 druid-1.0.9.jar(同样记得导入数据库驱动jar包)
2. 定义配置文件:
* 是properties形式的
* 可以叫任意名称,可以放在任意目录下(因为可以叫任意名称,可以任意加载,说明系统不会像C3P0一样自动读取配置文件,而需要我们手动加载)
3. 加载配置文件。Properties
4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory的createDataSource(new Properties)方法,参数是加载了相应配置文件读取流的Properties对象。
5. 获取连接:getConnection
代码:
package lkj.test.druidDemo;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;