数据库连接池 Connection Pool 是什么,做什么
来源:互联网 发布:网络通缉犯在逃人员 编辑:程序博客网 时间:2024/05/21 07:46
重新拾起Java来学,就遇到了一本不错的书《Hibernate 深入浅出》电子工业出版社,相较其他的工具类书,本书中用词更加生动活泼,从字句之间就可以看出作者的用心与深厚的文字功底,让人相信,此书值得一看。
说道数据库,头脑中一下子就想到了经典的连接步骤,确实通过JDBC获取数据库连接是件再简单不多的事情,但对于JDBC Driver来说,连接数据库却并非一件轻松的差事,因为底层它还需要做很多其他事情,那么它还需要做些什么呢?
(1)数据库连接要在服务器与数据库服务器之间建立一个Socket Connection
(2)连接建立之后,应用服务器和数据库服务器之间还需要交换若干次数据(验证用户密码、权限等)
(3)然后,数据库开始初始化连接会话句柄,记录联机日志,为此连接分配相应的处理进程和系统资源。
系统如此忙碌,如果我们只是简单的扔过去两个SQL语句,然后就将此连接抛弃,是在可惜,而数据库技术正是为了解决这个问题。
外部使用者可以通过getConnection方法获取连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时连接并没有关闭,而是有连接池管理器回收,并为下一次使用做好准备。下面我们用代码简单模拟一个连接池,主要实现的功能有:
(1)getConnection方法获取数据库连接,如果当前池中有可用连接,则将池中最后一个返回,如果没有,则新建一个;
(2)releaseConnection方法将使用完毕的数据库放回备用池,判断当前池中连接是否已超过阈值,如果超过,则关闭该连接,否则放回池中以备下次使用。
好了,下面是模拟代码:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Vector;public class DBConnectionPool implements ConnectionPool{private static Vector pool;private final int POOL_MAX_SIZE=20;/* * 获取数据库连接 * 如果当前池中有可用连接,则将池中最后一个返回,如果没有,则新建一个 */public synchronized Connection getConnection() throws BDException {if(pool == null){pool = new Vector();}Connection conn;if(pool.isEmpty()){conn=createConnction();} else {int last_idx = pool.size()-1;conn = (Connection) pool.get(last_idx);pool.remove(pool.get(last_idx));}return conn;}/* * 将使用完毕的数据库放回备用池 * 判断当前池中连接是否已超过阈值,如果超过,则关闭该连接; * 否则放回池中以备下次使用 */public synchronized void releaseConnection(Connection conn) {if(pool.size() > POOL_MAX_SIZE){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}else{pool.add(conn);}}/* * 读取数据库连接信息,并从数据库连接池中获取数据库连接 */private static Connection createConnction() throws BDException {Connection conn;try {Class.forName("oracle.jdbc.driver.OracleDriver");conn =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oracle","personal","personal");return conn;} catch (ClassNotFoundException e) {throw new DBException{"ClassNotFoundException when loading JDBC Driver"};}catch(SQLException e){throw new DBException{"SQLException when loading JDBC Driver"};}}}当然这个是及其简单仍有很多bug 的模拟,但通过此模拟可以对连接池有一定的理解。
- 数据库连接池 Connection Pool 是什么,做什么
- 数据库连接池(connection pool)是个什么东东
- 数据库连接池技术(Connection Pool)
- 数据库连接池(Connection Pool)
- 数据库连接池-DBCP (Apache Database Connection pool)
- JDBC----数据库连接池(connection pool)
- 数据库连接池(connection pool)的工作原理
- 连接池 connection pool
- 用apache的dbcp来建立独立的数据库连接池(db connection pool)
- Commons pool 数据库连接池实现
- Commons pool 数据库连接池实现
- Nodejs 数据库连接池generic-pool
- Connection Pool
- Connection Pool
- xwiki是什么?能做什么?
- netty 是什么、能做什么?
- Dubbo是什么?能做什么?
- jsp中实现连接池(Connection Pool)
- c++中关于SQLite中文乱码的解决方法
- 关于boost在vs中的编译错误的问题的解决
- 使用不同的SVM对iris数据集进行分类并绘出结果
- ANT教程经典
- 使用动态规划求解最长递增子序列(LIS)
- 数据库连接池 Connection Pool 是什么,做什么
- Android DatePicker使用遇到了一些问题
- 效率就是生命,C中的常量和变量
- Android开发之Pending Intent
- log4j.additivity用法和例子
- 枚举类完美解读
- Pixhawk之姿态解算篇(4)_补充篇
- python 定时执行脚本,通过设置定时任务执行python 脚本
- day1