jdbc使用二

数据库连接池

  1. 第一篇我们讲了JDBC的入门,我们每次访问数据库都要获取数据库连接,而数据库的连接的打开和关闭都会耗费很大的性能,所以为了解决这个问题出现了数据库连接池。
  2. 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
  3. 连接池的最小和最大连接我们都可以通过开源的连接池框架提高的方法进行设置
  4. 连接池内部都实现了 javax.sql.DataSrouce 接口
    通过连接池获取的con关闭只是将连接还到连接池里

    DBCP连接池

  5. DBCP 是 Apach软件基金组织下的开源数据库连接池的实现,使用DBCP 数据源,应用程序需要在系统中增加两个jar文件:
    Commons-dbcp.jar : 连接池的实现
    Commons-pool.jar : 连接池实现的依赖库
  6. 文档 http://commons.apache.org/proper/commons-dbcp/
  7. 第一种使用方法

    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
    public void demo1() {
    // 需求:使用DBCP连接池获得连接 遍历emp表的名字
    String url = "jdbc:mysql://47.94.23.210:3306/jdbcdemo";
    String user = "root";
    String password = "jBrkaTs00b8c";
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl(url);
    ds.setUsername("root");
    ds.setPassword(password);
    cpds.setMaxPoolSize(20);//设置连接池的最大连接数
    cpds.setMinPoolSize(2);//设置连接池的最小连接数
    cpds.setInitialPoolSize(10);//设置连接池的初始连接数
    cpds.setMaxStatements(100);//设置连接池的缓存Statement的最大数
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
    // 获得连接
    conn = ds.getConnection();
    // 获得发送sql的对象
    String sql = "select * from user";
    stmt = conn.prepareStatement(sql);
    // 发送sql执行 返回结果
    rs = stmt.executeQuery();
    // 处理结果
    while (rs.next()) {
    String name = rs.getString("username");
    System.out.println(name);
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    // 释放资源
    JDBCUtil.release(conn, stmt, rs);
    }
    }
  8. 第二种配置文件的方法:

    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
    //第二种配置文件
    @Test
    public void demo2() throws Exception {
    Properties properties=new Properties();
    InputStream in= UserDao.class.getClassLoader().getResourceAsStream("db.properties");
    properties.load(in);
    DataSource createDataSource = BasicDataSourceFactory.createDataSource(properties);
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
    // 获得连接
    conn = createDataSource.getConnection();
    // 获得发送sql的对象
    String sql = "select * from user where username='lisi' ";
    stmt = conn.prepareStatement(sql);
    // 发送sql执行 返回结果
    rs = stmt.executeQuery();
    // 处理结果
    while (rs.next()) {
    String name = rs.getString("username");
    System.out.println(name);
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    // 释放资源
    JDBCUtil.release(conn, stmt, rs);
    }
  9. 总结 :

  • 开源连接池 DBCP 他实现了javax.sql.DataSrouce 接口
  • 通过 getConnection()方法,从集合中获取连接
  • dbcp 提供实现类,需要告诉dbcp连接数据库的参数信息。
  • 可以通过配置文件的方式,配置数据库的连接参数。
  • dbcp要连接的参数信息放到properties文件中。

    C3P0连接池

  1. c3p0,全名叫ComboPooledDataSource;
  1. 快速使用

    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
    @Test
    public void demo1() throws PropertyVetoException {
    String url = "jdbc:mysql://47.94.23.210:3306/jdbcdemo";
    String user = "root";
    String password = "jBrkaTs00b8c";
    // 配置连接池
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass("com.mysql.jdbc.Driver"); // loads the jdbc driver
    cpds.setJdbcUrl(url);
    cpds.setUser(user);
    cpds.setPassword(password);
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
    // 获得连接
    conn = cpds.getConnection();
    // 获得发送sql的对象
    String sql = "select * from user";
    stmt = conn.prepareStatement(sql);
    // 发送sql执行 返回结果
    rs = stmt.executeQuery();
    // 处理结果
    while (rs.next()) {
    String name = rs.getString("username");
    System.out.println(name);
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    // 释放资源
    JDBCUtil.release(conn, stmt, rs);
    }
    }
  2. 配置文件的方式

  • 我们在src目录下新建c3p0-config.xml

    1
    2
    3
    4
    5
    6
    7
    8
    <c3p0-config>
    <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day08</property>
    <property name="user">root</property>
    <property name="password">123</property>
    </default-config>
    </c3p0-config>
  • C3P0 自己去找 c3p0-config.xml 这个文件

  • 要求:c3p0-config.xml 必须放到 src目录下。
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
@Test
public void demo2() throws PropertyVetoException {
// 配置连接池
ComboPooledDataSource cpds = new ComboPooledDataSource();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
// 获得连接
conn = cpds.getConnection();
// 获得发送sql的对象
String sql = "select * from user";
stmt = conn.prepareStatement(sql);
// 发送sql执行 返回结果
rs = stmt.executeQuery();
// 处理结果
while (rs.next()) {
String name = rs.getString("username");
System.out.println(name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
JDBCUtil.release(conn, stmt, rs);
}
}

源码地址

github地址:https://github.com/yalunwang/java-clump