当前位置: 首页 > news >正文

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方法归还连接。

 

 

转载于:https://www.cnblogs.com/ljwdemo/p/7636102.html

相关文章:

  • windows   8   OneNoteMX
  • 第二次作业-Steam软件分析
  • [面试] 组合(非递归)
  • Which garbage collection strategy is using
  • OutputCache造成页面响应内容类型为text/vnd.wap.wml的问题
  • windws 8 应用小技巧(11-15)
  • Mac禁用ipv6
  • C语言程序设计第一次作业
  • 学习PrintWriter类
  • 物联网设备漏洞不断增加 五大安全层面随时检视
  • 从ORACLE转战虚拟化 与VMware展开肉搏战来看
  • js 返回时间 字符串
  • ubuntu14.04安装nginx
  • 函数论_E.C.Tichmarsh_Page 4 例题 i,ii
  • 【物联网智能网关-12】以网关为核心,互联网为基础构建物联网平台
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • java中的hashCode
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • 安卓应用性能调试和优化经验分享
  • 关于 Cirru Editor 存储格式
  • 免费小说阅读小程序
  • 面试遇到的一些题
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端之Sass/Scss实战笔记
  • 使用 5W1H 写出高可读的 Git Commit Message
  • ​ubuntu下安装kvm虚拟机
  • #Linux(帮助手册)
  • #数学建模# 线性规划问题的Matlab求解
  • (6)设计一个TimeMap
  • (二十四)Flask之flask-session组件
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (算法)前K大的和
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)程序员疫苗:代码注入
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net 后台导出excel ,word
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • // an array of int
  • /var/spool/postfix/maildrop 下有大量文件
  • [ IO.File ] FileSystemWatcher
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [AIGC 大数据基础]hive浅谈
  • [Android]常见的数据传递方式
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [CCIE历程]CCIE # 20604
  • [codeforces] 25E Test || hash
  • [echarts] y轴不显示0
  • [Geek Challenge 2023] web题解
  • [LeetCode][面试算法]逻辑闭环的二分查找代码思路
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字
  • [linux] GFLOPS和TFLOPS的换算
  • [Linux] Ubuntu install Miniconda
  • [MRCTF2020]Ez_bypass1
  • [node]Node.js 模块系统