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>();
    
    //初始化链接池时,向链接池内放入10个链接   
    public MyDataSourse(){
        try {
            for(int i = 0;i< 10 ;i++){
                this.connectionsPool.addLast(this.createConnection());
            }
        } catch (SQLException e) {
//            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    //得到链接
    public Connection getConnection(){
        return this.connectionsPool.removeFirst();
    }
    
    //释放链接  如果用链接池的话,当我们要释放资源的时候就不能够简单的把conn给关闭掉,而应该是把conn重新放回到链接池中
    public void free(Connection conn){
        this.connectionsPool.addLast(conn);
    }
    //创建链接
    private Connection createConnection() throws SQLException{
        return DriverManager.getConnection(url,user,pwd);
    }
}
/*
 * 当我们对数据库进行操作时,往往花费在建立和数据库的链接时花费的时间最长,所以最好就是链接保证链接不要
 * 频繁的建立,这时就应该考虑到创建一个链接池,每次用的时候直接从链接池中去取,用完后再放回去
 * 这样做虽然在创建时花费的时间会很长,但是一旦创建完成,在用的时候就能够很好的提高效率
 * */
//////////////////////////////////////此时jdbcUtils包就应该改为这样//////////////////////////////////////////////////////////////////////////

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import cn.itcast.jdbc.datasourse.MyDataSourse;

public final class JdbcUtils {
    private static String url = "jdbc:mysql://localhost:3306/test";
    private static String user = "root";
    private static String password = "";
   // private static MyDataSourse myDataSourse = new MyDataSourse();    //这里myDataSourse不能在这里进行初始化,因为myDataSourse的初始化动作之前需要先注册驱动

  private static MyDataSourse myDataSourse = null;  //此处只需要声明一下,初始化动作放在注册驱动的后面,不然会报初始化异常

// 私有的构造方法
    private JdbcUtils() {
    }

// 把注册驱动的动作放在静态代码块内
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");

    myDataSourse = new MyDataSourse();    //初始化动作放在注册驱动的后面

} catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }

// 建立链接
    public static Connection getConnection() throws SQLException {
//        return DriverManager.getConnection(url, user, password);
        return myDataSourse.getConnection();
    }

// 释放资源
    public static void free(ResultSet rs, Statement st, Connection conn) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (st != null) {
                    st.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        //conn.close(); 当使用链接池时,此处就不能够简单的关闭掉该conn了
                        myDataSourse.free(conn);//此时应该把链接conn重新放回到链接池中
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

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. 通过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 ...

  5. JDBC 数据库连接池

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

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

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

  7. c3p0链接池配置使用

    c3p0链接池初步使用:直接上代码 c3p0是开源面粉的连接池,目前使用它的开源项目主要有:Spring,Hibernate等,使用时需要导入相关jar包及配置文件c3p0-config.xml文件 ...

  8. 诡异的druid链接池链接断开故障经验总结

    背景 症状 排查 修复 背景 最近在陆续做机房升级相关工作,配合DBA对产线数据库链接方式做个调整,将原来直接链接读库的地址切换到统一的读负载均衡的代理 haproxy 上,方便机柜和服务器的搬迁. ...

  9. java 代码实现使用Druid 链接池获取数据库链接

    因为原先使用的c3p0链接池,时常出现:APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks,以及出 ...

随机推荐

  1. 【CF1068D】Array Without Local Maximums(计数DP)

    题意: n<=1e5 思路:卡内存 dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间大小关系为k的方案数(a[i-1]<a[i],=,>) 转移时使用前缀和和 ...

  2. Xcode打包和生成ipa文件

    1.生成Archive文档 a) 需将左上角红色方框里的设备类型选为ios device,不能选择具体的设备类型,否则不能生成Archive文档: b) 中部选择Team的方框,可此时选,也在后续ex ...

  3. 读扇区错误:0柱面0磁头1扇区(硬盘问题,蓝屏等 0x0000007B)

    原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] 读扇区错误:0柱面0磁头1扇区(硬盘问题,蓝屏等 0x0000007B) DISKGEN能找到,那就没什么大问题的 ...

  4. C#设计模式视频教程(不知道讲的好不好,刚刚看到)

    原文发布时间为:2008-12-08 -- 来源于本人的百度文章 [由搬家工具导入] http://u.youku.com/user_video/uid_happyboy27.html 优酷网。。

  5. asp.net内置对象 Response对象使用介绍

    Response对象是HttpRespone类的一个实例.该类主要是封装来自ASP.NET操作的HTTP相应信息.Response对象将数据作为请求的结果从服务器发送到客户浏览器中,并提供有关响应的消 ...

  6. AC日记——[中山市选2009]谁能赢呢? bzoj 2463

    2463 思路: 博弈: 把先手和后手的走的两个格子看做一个1*2的方格: 如果n为偶数,那么棋盘一定可以被1*2的方格覆盖: 前端为先手,后端为后手: 那么,当还剩下一个1*2的方格时,先手一定可以 ...

  7. 对动态规划(Dynamic Programming)的理解:从穷举开始(转)

    转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...

  8. 创建一个vue-cli项

    一.vue cli脚手架 Vue 提供了一个官方的cli,为单页面应用 (SPA) 快速搭建繁杂的脚手架,通过这个工具我们就可以很方便的来创建一个基于vue的项目. 二.安装一些必要的东西node.n ...

  9. JUC线程池深入刨析

    JDK默认提供了四种线程池:SingleThreadExecutor.FiexdThreadPool.CachedThreadPool.ScheduledThreadPoolExecutor. 本文会 ...

  10. 模型搭建练习1_用numpy和tensor、variable实现前后向传播、实现激活函数

    用numpy实现搭建一个简单的forward和backward import numpy as np N, D_in, H, D_out = 64, 1000, 100, 10 x = np.rand ...