JDBC(连接池) -- 02(I)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC(连接池) -- 02(I)相关的知识,希望对你有一定的参考价值。

自定义连接池一:
    1.sun提供了一个连接池接口 javax.sql.DataSource。
    2.定义连接池MyDataSource实现接口DataSource。
    3.使用集合LinkedList<Connection> pool存放多个连接对象。LinkedList移除添加操作效率高。连接对象还是和以前一样调用工具类JDBCUtils里的getConnection。(第一篇JDBC的有介绍)
    4.书写获取连接的方法getConnection(),获取连接改为从池子中拿对象。
    5.书写归还连的方法backConnection()。把从池子pool中获取的对象归还。

    我们需要三个类:
  1.JDBCUtils(第一篇JDBC的随笔有介绍如何书写)
  2.MyDataSource
  3.TestMyDataSource

注:测试用的Junit。
一、书写MyDataSource方法,此处不实现接口DataSource
package com.it.JDBC;

import java.sql.Connection;
import java.util.LinkedList;

/**
 * @author Payphone
 * @time 2017-10-07 自定义连接池,未增强close方法
 * */
public class MyDataSource {

    private static Connection conn;
    private static LinkedList<Connection> pool = new LinkedList<Connection>();

    /**
     * 构造方法初始化连接池个数,也可用静态代码块初始化。
     * */
    public MyDataSource() {
        for (int i = 0; i < 5; i++) {
            conn = JDBCUtils.getConnection();
            pool.add(conn);
        }
        System.out.println("---------分割线---------");
    }

    /**
     * 获取连接
     * */
    public Connection getConnection() {
        System.out.println("连接前的个数:" + pool.size());
        conn = pool.remove(0);
        System.out.println("连接后的个数:" + pool.size());
        return conn;
    }

    /**
     * 归还连接
     * */
    public void backConnection() {
        System.out.println("释放连接前的个数:" + pool.size());
        pool.add(conn);
        System.out.println("释放连接后的个数:" + pool.size());
    }
}

二、书写测试方法TestMyDataSource

package com.it.TestJDBC;

import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;

import com.it.JDBC.JDBCUtils;
import com.it.JDBC.MyDataSource;

public class TestMyDataSource {

    @Test
    public void testAddUser() {
        Connection conn = null;
        MyDataSource md = new MyDataSource();
        PreparedStatement psmt = null;
        try {
            conn = md.getConnection();
            String sql = "insert into t_user(id,pwd) values(?,?)";
            psmt = conn.prepareStatement(sql);
            psmt.setInt(1, 2015005);
            psmt.setString(2, "2015005");
            int rows = psmt.executeUpdate();
            if (rows > 0) {
                System.out.println("插入数据成功!");
            } else {
                System.out.println("插入数据失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils.Release(null, psmt, null);
            md.backConnection();
        }
    }
}

自定义连接池一代码并不完善,我们调用了工具类JDBCUtils.Release方法释放了除conn外的对象。又调用了md.backConnection方法归还conn。

在自定义连接池二的代码中我们将增强close方法。调用工具类JDBCUtils.Release方法归还连接。

 

 











































以上是关于JDBC(连接池) -- 02(I)的主要内容,如果未能解决你的问题,请参考以下文章

Java 微服务 day02 源代码 SpringBoot 实战开发 整合JDBC和事务(数据库连接池)

哪个更好:JDBC 连接池,还是使用 SIngleton 类进行 JDBC 连接?

JDBC(连接池) -- 02(II)

Unit02: JDBC核心API

如何重置 JDBC 连接池

JAVA保姆式JDBC数据库免费教程之02-连接池技术