Java数据库连接池的实现(不用框架)
来源:互联网 发布:做淘宝刷手有风险吗 编辑:程序博客网 时间:2024/06/08 10:01
前言:因为需要正式做项目,了解到了连接池这个东西。在网上找了很多资料,发现都是大同小异,各种转载,看上去搜出来了几十个答案,结果很可能是同一个。并且大多都是基于框架的数据库连接池。可是我只是想采用MVC做一个不是很大的项目,不需要使用到框架啊。这可怎么办,最后没办法,弄清楚连接池的原理,配合网上的资料,自己写一个简单的吧(这里暂时不考虑多线程操作,后面会继续完善这个连接池,自己挖坑,后面慢慢补)
1、连接池是什么以及连接池的好处
这里想借用老师的例子,觉得非常的贴切。我是一个图书管理员(CPU),当需要有人来借书的时候(进行数据库操作),我首先需要去图书馆找到这本书(连接数据库),然后登记把书给借书的人(执行并返回执行结果),人们来还书的时候,我们再把书放回图书馆(关闭数据库)。这是我们普通的做法,这样的做法有一个问题是这样的,图书管理员在找书的时候需要花费10分钟(连接数据库),登记把书给借书的人(执行SQL语句)只需要1分钟。这就极大的降低了性能,因此就图书管理员就想了一个办法,我首先放一些书放在前台书桌上(连接池),然后别人来借书的时候(进行数据库操作的时候),我直接看书桌上还有没有书,如果有的话,直接登记就可以了,花费的时间约为1分钟,相对之前的借书流程提高了11倍。如果没有的话,我们再去图书馆找这本书(连接数据库)。在别人还书的时候,我们也不直接把书放回图书馆,而是放在书桌上(不关闭连接,放入连接池)。
2、简单连接池的具体实现
创建一个连接池,基本原理就是,我们先创建一堆数据库连接放在List中(初始化),在要进行连接的时候,我们判断是否连接池中还有连接,如果有就直接从连接池中获取,如果没有,我们再重新创建连接。并且我们使用完成以后也不要关闭,而是重新放回List中。
IDatabaseConnection接口文件
package DBPool;import java.sql.Connection;/** * @author xiaoD * @date 2017年11月22日 上午9:00:05 * Description: 定义一个接口,更换数据库的时候方便 */public interface IDatabaseConnection { //初始化 public void init(); //取得连接 public Connection getConnection(); //关闭 public void close(Connection conn);}
SQLServerHandler处理器
package DBPool;import java.sql.Connection;import java.sql.DriverManager;/** * @author xiaoD * @date 2017年11月22日 上午9:02:19 * Description: */public class SQLServerHandler { private static final String DBDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private static final String DBURL = "jdbc:sqlserver://localhost:1433;DatabaseName=xiaoD"; private static final String USERNAME = "sa"; private static final String PASSWORD = "sql2008"; private Connection conn = null; public Connection buildConnection() { try { Class.forName(DBDRIVER); this.conn = DriverManager.getConnection(DBURL, USERNAME, PASSWORD); }catch(Exception e) { e.printStackTrace(); } return conn; }}
SQLServerPool
package DB;import java.sql.Connection;import java.util.LinkedList;/** * @author xiaoD * @date 2017年11月22日 下午2:49:38 * Description: 构建一个连接池 */public class SQLServerPool implements IDatabaseConnection{ //最小连接数 private static final int minCount = 1; //最大连接数 private static final int maxCount = 10; //连接池 private static final LinkedList<Connection> pools = new LinkedList<Connection>(); SQLServerHandler handler = new SQLServerHandler(); /** * @author xiaoD * @date 2017年11月22日 下午2:49:38 * Description: 重写init */ public void init() { Connection conn = null; try{ for(int i=0; i<minCount; i++) { conn = handler.buildConnection(); pools.add(conn); } }catch(Exception e) { e.printStackTrace(); } } /** * @author xiaoD * @date 2017年11月22日 下午2:49:38 * Description: 重写getConnection */ public synchronized Connection getConnection() { Connection conn = null; if(pools.size() == 0) { conn = handler.buildConnection(); } else { conn = pools.remove(0); } return conn; } /** * @author xiaoD * @date 2017年11月22日 下午2:49:38 * Description: 重写close */ public synchronized void close(Connection conn) { if(pools.size() < maxCount) { pools.add(conn); } System.out.println(pools); }}
测试类
package DB;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;/** * @author xiaoD * @date 2017年11月22日 下午2:52:00 * Description: */public class DatabseTest { static IDatabaseConnection SQLServer = new SQLServerPool(); public static void main(String args[]) { SQLServer.init(); long start = System.currentTimeMillis(); for(int i=0; i<300; i++) { test(); } long end = System.currentTimeMillis(); System.out.println(end-start); } private static void test() { try{ Connection conn = SQLServer.getConnection(); String sql = "select * from users"; PreparedStatement pst = conn.prepareStatement(sql); ResultSet rs = pst.executeQuery(); System.out.println(rs); pst.close(); SQLServer.close(conn); }catch(Exception e) { e.printStackTrace(); } }}
(完) 2017/11/222 20:30
阅读全文
0 0
- Java数据库连接池的实现(不用框架)
- 数据库连接池的Java实现
- Java 数据库连接池的实现
- Java框架数据库连接池
- 数据库连接池实现(JAVA SE)实现
- Java框架数据库连接池比较
- Java框架数据库连接池比较
- Java框架数据库连接池比较
- java实现数据库连接池
- Java数据库连接池实现
- JAVA数据库连接池实现
- Java 数据库连接池 实现
- JAVA数据库连接池实现
- JAVA数据库连接池实现
- JAVA数据库连接池实现
- JAVA数据库连接池实现
- JAVA数据库连接池实现
- JAVA数据库连接池实现
- 用Chrome开发者工具做JavaScript性能分析
- 大部分企业站都会遇到的懵逼seo问题
- python语言-99乘法表各种实现
- java根据经纬度坐标计算两点的距离算法,与百度地图测距工具相符
- Oracle 用户表空间查看、修改大小、设置自增长等
- Java数据库连接池的实现(不用框架)
- BlueZ交叉编译
- npm install 报错整理
- 15.开源项目--git reset(置位)
- 初创团队的 Android 应用质量保障之道
- 开发者死后,他的开源项目会有人继续维护吗?
- 早上睡醒后,程序员如何快速清醒头脑?
- 主流前端技术对比
- 想当高薪码农,请收好这份职场通关宝典!