package cn.itcast.jdbc.datasourse;

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

public class MyDataSourse {
    private static String url = "jdbc:mysql://localhost:3306/test";
    private static String user = "root";
    private static String pwd = "";
    
    //用于存放链接
    private LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
    
    /*当创建链接时,不是随意的我想创建多少个链接就创建多少个链接,这时因为数据库的链接是有限的
     * 当超过这个范围时,数据库是承受不了的,所以我们就要限制创建链接的个数*/
    private static int initCount = 5;     //设置最小链接数
    private static int maxCount = 20;     //设置最大链接数
    private int currentCount = 0;         //记录当前链接数
    
    
    //初始化链接池时,向链接池内放入10个链接   
    public MyDataSourse(){
        try {
            for(int i = 0;i< initCount ;i++){
                this.connectionsPool.addLast(this.createConnection());
                this.currentCount++;
            }
        } catch (SQLException e) {
//            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    //得到链接
    /*Connection是不支持多线程的,当有多个请求建立链接时,就要保证他们各自拿到的链接不相等
     * 这时就需要用到同步代码块*/
    public Connection getConnection() throws SQLException{
        synchronized(connectionsPool){      //这里的锁用的就是链接池
            if(this.connectionsPool.size() > 0){    //如果池里还有就直接取
                return this.connectionsPool.removeFirst();
            }
            if(this.currentCount < maxCount) {  //如果池里没有了,就判断当前链接是否超过最大链接数,如果没有就创建
                this.currentCount++;
                return this.createConnection();
            }
            /*如果说池里没有了,而且已经达到最大链接数这时有3种处理方式
             * 1 抛一个异常出去
             * 2 返回一个null
             * 3 让它等待别人释放链接
             * 这里简单的处理,抛一个异常出去
             * */
            throw new SQLException("已没有链接");
        }
    }
    
    //释放链接  如果用链接池的话,当我们要释放资源的时候就不能够简单的把conn给关闭掉,而应该是把conn重新放回到链接池中
    public void free(Connection conn){
        this.connectionsPool.addLast(conn);
    }
    //创建链接
    private Connection createConnection() throws SQLException{
        return DriverManager.getConnection(url,user,pwd);
    }
}
/*
 * 当我们对数据库进行操作时,往往花费在建立和数据库的链接时花费的时间最长,所以最好就是链接保证链接不要
 * 频繁的建立,这时就应该考虑到创建一个链接池,每次用的时候直接从链接池中去取,用完后再放回去
 * 这样做虽然在创建时花费的时间会很长,但是一旦创建完成,在用的时候就能够很好的提高效率
 * */

/*这种方法实际上还存在问题,原因是当调用着在执行完数据库的操作后没有用free方法去关闭链接,而是直接conn.close()将链接给关掉了,这样链接就不能重新放回到连接池中

这时就要考虑用代理的模式去修改代码,解决这个问题,让调用着在执行conn.close()方法时,实际上是将该链接放回到连接池中*/

jdbc 链接池的优化的更多相关文章

  1. 自定义JDBC链接池

    上篇简单介绍了jdbc链接数据库: 本篇就说一下自定义连接池以及增删改查的测试: 自定义连接池 自定义链接池的原因 JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  ...

  2. jdbc 链接池

    package cn.itcast.jdbc.datasourse; import java.sql.Connection;import java.sql.DriverManager;import j ...

  3. JDBC核心技术(获取数据库链接、数据库事务、数据库链接池)

    @ 目录 前言 数据的持久化 Java数据存储技术 JDBC介绍 JDBC体系结构 获取数据库链接 Driver接口 加载注册JDBC驱动 获取数据库链接 数据库链接方式(实例) 方式一:代码中显示出 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  5. 数据层优化-jdbc连接池简述、druid简介

    终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...

  6. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

  7. 通过dbcp链接池对数据库操作报 Cannot create PoolableConnectionFactory (Could not create connection to database server. Attempted reconnect 3 times. Giving up.)--解决方案

    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for ...

  8. JDBC 数据库连接池

    http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html JDBC 数据库连接池 小结   当对数据库的访问不是很频繁时,可以在每次 ...

  9. 数据库链接池c3p0的配置

    由于我看的是远古教程,所以里面各种驱动jar包还有c3p0包都是远古版本,对于最新版本的jdbc已经失去的作用,所以我在这里重写一下! 1.首先是c3p0的位置,package的外面,src的里面 2 ...

随机推荐

  1. 30+ Excellent Windows Phone 7 Development Tutorials

    原文发布时间为:2012-01-16 -- 来源于本人的百度文章 [由搬家工具导入] Here are 30+ cool Windows Phone Development articles for ...

  2. Html.AntiForgeryToken 防止伪造提交

    原文发布时间为:2011-05-03 -- 来源于本人的百度文章 [由搬家工具导入] In this tutorial, I am not going to discuss the concept i ...

  3. Spy++使用方法

    原文转自 http://jingyan.baidu.com/article/3a2f7c2e76584a26aed61174.html 1.Spy++ 是Visual Studio 自带的工具(菜单& ...

  4. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---15

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  5. LeetCode OJ-- Surrounded Regions **@

    https://oj.leetcode.com/problems/surrounded-regions/ 棋盘类的题目.找出所有没有被 X 包围的 O 使用深搜,但是太深了,run time erro ...

  6. POJ1655 Balancing Act(树的重心)

    题目链接 Balancing Act 就是求一棵树的重心,然后统计答案. #include <bits/stdc++.h> using namespace std; #define REP ...

  7. Cocos 2d-X Lua游戏开发Mac环境搭建以及一点点感悟

    接触Cocos2d-x 最近由于公司项目的需要,自己开始接触Cocos,开始做一些简单的轻量级的游戏,以前没有接触过这一块的东西,也是借助这个机会学习一下游戏的开发,由于以前自己接触的全都是iOS和A ...

  8. Cat Snuke and a Voyage --AtCoder

    题目描述 In Takahashi Kingdom, there is an archipelago of N islands, called Takahashi Islands. For conve ...

  9. Single Number II - LeetCode

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  10. Arc Object开发,概述2

    简介 Esri公司推出的ArcGIS产品是一个非常强大的体系,里面包含ArcGIS Desktop.ArcGIS Server.ArcGIS Engine.ArcSDE.ArcGIS Online等, ...