1、什么是连接池:其实就是一个容器,在这个容器当中存放着多个连接对象。
- 当系统用开始运行时,可以让系统提前去创建 多个连接对象。放到容器中(连接池),当客户端需要连接对象时,可以从连接池中申请一个连接,去访问数据库,当该连接使用完毕时,不在释放归还给系统,而是把这个连接对象归还给连接池
2、好处:
- 可以大大节省系统开销
- 可以提高访问的速度
3、实现操作:
javax.sql 连接池
JNDI -----> java Naming and Directory Interface java命名和目录接口
使用JNDI降低程序和数据库的耦合度,使你的程序更加方便配置和维护以及部署
是javaEE中规范中的重要规范之一。是EJB的相关的知识
DataSource接口它里面并不提供具体的实现,而是由驱动程序供应商(数据库厂商提供的)
1. c3p0: 它是数据库连接池的一套技术
2. druid:也是一套数据据库连接池的技术,由阿里巴巴提供的。
4、C3p0:数据库连接池技术
步骤:
- 去官网下载两个jar包:c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar(官方网站:请点击)
- 植入到工程的classpath类路径下,不要忘记导入mysql驱动jar包 mysql-connector-java.jar
- 定义配置文件:
①文件类型:c3p0.properties 或者 c3p0-config.xml
②路径:放到classpath类路径下 对于工程来说直接放到src下面即可 - 获取DataSource对象 : 数据库连接池对象 通过实例化ComboPooledDataSource来获取
- 从连接池中获取连接对象。 getConnection()
1、C3p0配置环境例子如下:
配置文件
c3p0-config.xml
<c3p0-config>
<!--使用默认配置数据源 -->
<default-config>
<!--连接数据库的四大组件 -->
<!-- 配置驱动类 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 配置url -->
<property name="jdbcUrl">jdbc:mysql:///java31?characterEncoding=utf8
</property>
<!-- 配置登录账户 -->
<property name="user">root</property>
<!-- 账户密码 -->
<property name="password">admin</property>
<!--连接池的其他参数 -->
<!-- 最大连接数量 -->
<property name="maxPoolSize">10</property>
<!-- 最小的连接数量 -->
<property name="minPoolSize">3</property>
<!-- 初始化申请的连接数量 -->
<property name="initialPoolSize">10</property>
<!-- 超时时间 -->
<property name="checkoutTimeout">1000</property>
</default-config>
<!-- 这里为自定义配置 可以配置多种数据库信息 例 如下 -->
<named-config name="Oracle">
<!-- 配置驱动类 -->
<property name="driverClass">com.oracle.jdbc.Driver</property>
<!-- 配置url -->
<property name="jdbcUrl">jdbc:oracle:///java31?characterEncoding=utf8
</property>
<!-- 配置登录账户 -->
<property name="user">root</property>
<!-- 账户密码 -->
<property name="password">admin</property>
<!--连接池的其他参数 -->
<!-- 最大连接数量 -->
<property name="maxPoolSize">30</property>
<!-- 最小的连接数量 -->
<property name="minPoolSize">10</property>
<!-- 初始化申请的连接数量 -->
<property name="initialPoolSize">10</property>
<!-- 超时时间 -->
<property name="checkoutTimeout">3000</property>
</named-config>
</c3p0-config>
C3p0Demo01.java:
public class C3p0Demo01 {
public static void main(String[] args) throws SQLException {
// 通过combopooledDataSource对象来获取连接池(数据源)
DataSource pool = new ComboPooledDataSource();
// 获取连接
for (int i = 0; i < 10; i++) {
Connection con = pool.getConnection();
System.out.println(con);
if(i==5) {
con.close();
}
}
Connection con1 = pool.getConnection();
System.out.println(con1);
}
}
2、将c3p0技术单独提取到生成一个工具类,(配置文件信息同上)以优化代码为由,代码如下:
/**
* 使用C3p0连接池搭建数据库工具类
*/
public class C3p0Util {
// 通过combopooledDataSource对象来获取连接池(数据源)
private static final DataSource POOL = new ComboPooledDataSource();
// 提供一个获取连接的方法
public static Connection getConnection() {
Connection con = null;
try {
con = C3p0Util.POOL.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
// 对外再提供一个获取连接池的方法
public static DataSource getDataSource() {
return POOL;
}
// 释放资源的方法
public static void closeAll(ResultSet set, PreparedStatement ps, Connection con) {
if (set != null) {
try {
set.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
5、Druid 德鲁伊连接池技术
- 步骤:
- 去官网去下载一个德鲁伊的jar —> druid-1.0.9.jar(官方网站:请点击)
- 定义配置文件:使用properties文件类型的,名字随便起
- 手动加载配置文件信息: Properties集合
- 获取DataSource对象 :通过工厂方式来实现的,DruidDataSourceFactory
- 从连接池中获取连接对象:getConnection()
例子如下:
1、德鲁伊的配置文件如下:
druid.properties
# 键值对格式的 键和值用=连接
# 连接数据库的四大组件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///java31?characterEncoding=utf8
username=root
password=admin
#初始化池子的连接数量
initialSize=10
# 最大池子连接数量
maxActive=50
#最长等待时间
maxWait=3000
配置德鲁伊环境如下代码
public class DruidDemo01 {
public static void main(String[] args) throws Exception {
// 手动加载配置文件信息 使用Properties集合
Properties properties = new Properties();
// 读取配置文件信息类加载器 classpath 类路径下+
InputStream is = DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties");
// 使用properties集合读取输入流 load
properties.load(is);
//获取DataSource对象,通过工厂方式来实现的 DruidDataSourceFactory
DataSource pool = DruidDataSourceFactory.createDataSource(properties);
//从池中获取一个连接对象
Connection connection = pool.getConnection();
System.out.println(connection);
}
}
德鲁伊操作数据库代码如下:
public class DruidDemo02 {
private static DataSource pool = null;
// 把加载德鲁伊的一套放进静态代码块中
static {
// 手动加载配置文件信息 使用Properties集合
Properties properties = new Properties();
// 使用当前类的字节码对象获取该字节码对象的类加载器读取配置文件信息 classpath 类路径下+
InputStream is = DruidDemo02.class.getClassLoader().getResourceAsStream("druid.properties");
// 把输入流中的信息读取properties集合当中
try {
properties.load(is);
// 获取DataSource对象,通过工厂方式来实现的 DruidDataSourceFactory
pool = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception{
// 添加一条数据
/**
* insertData();
*/
// 修改一条数据 王五---->小五
/**
* updataData();
*/
// 删除一条数据
/**
* deleteData();
*/
// 查询群某个表中的全部数据
queryAll();
}
// 添加一条数据
public static void insertData() throws Exception {
// 注册驱动
// 获取连接
Connection con = pool.getConnection();
// 准备sql语句、
String sql = "insert into account values(null,?,?)";
// 获取执行sql对象
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "王五");
ps.setDouble(2, 5000);
// 执行sql语句,把sql语句发送给mysql服务器
int count = ps.executeUpdate();
if (count > 0) {
System.out.println("添加成功.....");
} else {
System.out.println("添加失败.....");
}
// 释放资源
ps.close();
con.close();//归还给连接池
}
public static void updataData() throws Exception {
Connection con = pool.getConnection();
String sql = "update account set username = ? where username = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "小五");
ps.setString(2, "王五");
int count = ps.executeUpdate();
if(count > 0) {
System.out.println("修改成功.....");
}else {
System.out.println("修改失败.....");
}
ps.close();
con.close();
}
public static void deleteData() throws Exception {
Connection con = pool.getConnection();
String sql = "delete from account where username = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "小五");
int count = ps.executeUpdate();
if(count > 0) {
System.out.println("删除成功.....");
}else {
System.out.println("删除失败.....");
}
ps.close();
con.close();
}
//查询全部字段
public static void queryAll() throws Exception {
Connection con = pool.getConnection();
String sql = "select * from account";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet set = ps.executeQuery();
//遍历
while(set.next()){
System.out.println(set.getInt(1)+"-->"+set.getString(2)+"--->"+set.getDouble(3));
}
ps.close();
con.close();
}
}
2、将德鲁伊单独提取到生成一个工具类,(配置文件信息同上)以优化代码为由,代码如下:
/**
* 使用德鲁伊连接池配置工具类
*
*/
public class DruidUtil {
private static DataSource pool;
// 把加载德鲁伊的一套放进静态代码块中
static {
// 手动加载配置文件信息 使用Properties集合
Properties properties = new Properties();
// 使用当前类的字节码对象获取该字节码对象的类加载器读取配置文件信息 classpath 类路径下+
InputStream is = DruidDemo02.class.getClassLoader().getResourceAsStream("druid.properties");
// 把输入流中的信息读取properties集合当中
try {
properties.load(is);
// 获取DataSource对象,通过工厂方式来实现的 DruidDataSourceFactory
pool = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 对外提供获取连接的对象
public static Connection getConnection() throws SQLException {
return pool.getConnection();
}
// 提供获取连接池的方法
public static DataSource getDataSource() {
return pool;
}
// 释放资源的方法
public static void closeAll(ResultSet set, PreparedStatement ps, Connection con) {
if (set != null) {
try {
set.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}