Java--数据库连接池

  在我们使用数据库时,每次都需要获取数据库链接,而创建连接通常需要消耗较大的资源。对于一个很小的应用是没有什么问题,如果是一个复杂的数据库应用呢?是不是要很大的开销?如果我们去减少创建、关闭连接就会很好的降低资源消耗提升性能,于是就有了数据库连接池的出现。(注:本博客主要使用mysql数据库

不使用连接池

需要mysql-connector-java-5.0.8-bin.jar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.xiaoxiaomo.pool;

import java.sql.*;
import java.util.ResourceBundle;

/**
* 不使用连接池
* JDBC DEMO
* Created by xiaoxiaomo on 2016/4/26.
*/

public class UnPool {

public static void main(String[] args) {
// 创建连接
Connection conn = null;
PreparedStatement statm = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql:///xiaoxiaomo?useUnicode=true&characterEncoding=UTF-8",
"root", "root");
String sql = "update sys_user set mobile= ? where id = ?";
statm = conn.prepareStatement(sql) ;
statm.setString(1,"15826008888");
statm.setInt(2,2);
int b = statm.executeUpdate() ;
if (b == 1) {
System.out.println("更新成功");
}

} catch (Exception e) {
System.out.println("插入失败");
e.printStackTrace();
} finally {
// 关闭连接 释放资源
try {
if (rs != null)
rs.close();
if (statm != null)
statm.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

常用数据库连接池

数据库连接池的一些优点:

  1. 资源重用
  2. 更快的系统响应速度
  3. 新的资源分配手段
  4. 统一的连接管理,避免数据库连接泄漏

现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。

DBCP数据源

  1. DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP,需要如下两个 jar 文件(commons-dbcp-1.4.jarcommons-pool-1.5.6.jar):
  2. Tomcat 的连接池也是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
  3. 实例代码:注这里使用了配置文件,具体配置如下:
    DBCP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.xiaoxiaomo.pool.dbcp;

import java.sql.*;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

/**
* 数据库连接池dbcp
* Created by xiaoxiaomo on 2016/4/26.
*/

public class DbcpTest {
public static void main(String[] args) throws Exception {
//1. 数据源工厂创建数据库连接池
//BasicDataSource bds = new BasicDataSource();//可以不使用配置
BasicDataSourceFactory factory = new BasicDataSourceFactory();

//2. 创建配置文件对象
Properties prop = new Properties();
//加载配置文件流
prop.load( DbcpTest.class.getResourceAsStream("/dbcp.properties") );

//3. 加载配置文件 生成对应数据源
DataSource ds = factory.createDataSource(prop);
Connection conn = ds.getConnection();
Statement statm = conn.createStatement();
ResultSet rs = statm.executeQuery("select * from student");

while(rs.next()){
//处理rs.....
}

rs.close();
statm.close();
//不是真正的关闭连接,而是将连接返回连接池
conn.close();
}
}

C3P0

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0数据源在项目开发中使用得比较多。

  1. c3p0与dbcp区别
    dbcp没有自动回收空闲连接的功能
    c3p0有自动回收空闲连接功能
  2. 需要导入jar:c3p0-0.9.5.1.jarmchange-commons-java-0.2.10.jar
  3. 在类目录下加入C3P0的配置文件:c3p0-config.xml
    DBCP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.xiaoxiaomo.pool.c3p0;

import java.sql.*;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
* c3p0连接池用法
* Created by xiaoxiaomo on 2016/4/26.
*
*/

public class C3P0Test {
public static void main(String[] args) throws Exception {

// ComboPooledDataSource cpds = new ComboPooledDataSource();
ComboPooledDataSource cpds = new ComboPooledDataSource("momo");
Connection conn = cpds.getConnection();
Statement statm = conn.createStatement();
ResultSet rs = statm.executeQuery("select * from sys_user");

while(rs.next()){
//处理rs......
}

rs.close();
statm.close();
conn.close();
}

}

jdbcUtils

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

  • org.apache.commons.dbutils.QueryRunner –核心
  • org.apache.commons.dbutils.ResultSetHandler –工具类
  • rg.apache.commons.dbutils.DbUtils

  • 实例代码:
    DBCP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.xiaoxiaomo.pool.dbutil;

import java.sql.SQLException;
import java.util.List;

import com.xiaoxiaomo.pool.bean.SysUser;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
* DBUtils用法
* Created by xiaoxiaomo on 2016/4/26.
*
*/

public class DBUtilsTest {
public static void main(String[] args) throws Exception {

//数据源
ComboPooledDataSource cpds = new ComboPooledDataSource("momo");
//指定一个DBUtils核心类
QueryRunner query = new QueryRunner(cpds);

SysUser account = query.query(
"select * from sys_user",
new BeanHandler<SysUser>(SysUser.class));
System.out.print(account.toString());

cpds.close();
}

}

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器