黑马程序员技术交流社区

标题: 连接池的实现思路和方式 [打印本页]

作者: 范贞亮    时间: 2012-10-24 16:33
标题: 连接池的实现思路和方式
这个要怎么搞呢,
作者: 张忠豹    时间: 2012-10-24 17:23
建议视频-----王勇jdbc里面有详细的解释
本人理解:一下创建多个相关对象,使用的时候,直接拿一个过来用。而不是,用一次,创建一个。就像你去商店买东西,一次买一些东西回来。而不是,一次买一种东西拿回来,再接着买。这样的好处,当然是减少了时间空间的开销。
package day3.cn.itcast.jdbc.datasource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class MyDataSource {
        private static String url = "jdbc:mysql://localhost:3306/jdbc";
        private static String user = "root";
        private static String password = "";
/*        每个数据的connection的个数都是有限的,所以说数据库连接资源是非常宝贵的,使用完了之后就最好关闭掉。(客户端占用的资源释放掉)但是数据库连接都是非常耗时的。所以要建立数据库连接池。 数据库连接池:在服务器端运行时,创建多个数据库连接,将这些数据库连接存放到一个LinkedList集合中。每次客户端使用时,从集合中remove首连接,知道客户端使用完连接之后,又将remove的首连接添加到集合的末尾。这样就可以保证连接池中的连接是可以重复利用的。
*/
/*        为了防止数据库连接无限制的创建,在这里添加了initCount等变量,当当前连接数currentCount超过
        maxCount,获取连接时就会报出异常。
*/
        private static int initCount = 5;
        private static int maxCount = 10;
        private int currentCount = 0;
        LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
        public MyDataSource() {
                try {
                        for (int i = 0; i < initCount; i++) {
                                this.connectionsPool.addLast(this.createConnection());
                                this.currentCount++;
                        }
                } catch (SQLException e) {
                        throw new ExceptionInInitializerError(e);
                }
        }

        public Connection getConnection() throws SQLException {
                //为了防止并发情况的发生,这儿添加了同步代码块。防止两个人同时到达获取同一个连接。
                synchronized (connectionsPool) {
                        //当前连接池中还有连接,就返回连接池中的连接
                        if (this.connectionsPool.size() > 0)
                                return this.connectionsPool.removeFirst();
                        //当前连接数没有超过maxCount就应该创建连接
                        if (this.currentCount < maxCount) {
                                this.currentCount++;
                                return this.createConnection();
                        }
                        //如果连接数超过maxCount,就会报出异常
                        throw new SQLException("已没有链接");
                }
        }
        public void free(Connection conn) {
                this.connectionsPool.addLast(conn);
        }
        private Connection createConnection() throws SQLException {
                return DriverManager.getConnection(url, user, password);
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2