对Java初学者来说,数据库连接池同其它的XX池一样,看起来是很神秘的一种技术,其实都是难者不会,会者不难的情况。当了解了数据库连接池技术之后,数据库连接池并不神秘而是一个非常简单的小技巧。
为什么会有数据库连接池呢?对于一个系统来说,如果没有数据库连接,当你每次需要进行数据库操作时,都要获取连接,完成操作之后将连接关闭。当系统访问量上来之后,你就会发现系统将会有大量的实践都花在获取数据库连接和关闭连接上。因此如果我们建立一个数据库连接池,在系统启动时,一次性的获取若干条数据库连接加入到连接池中,当我们需要进行数据库操作时,直接从数据库连接池中拿到连接,用完之后不再关闭,而是将其放入连接池中,这样系统运行时将再不会有频繁的获取连接和关闭连接了。下面,我们就自己写一个简单的数据库连接池,并加以测试。
1. ConnectionPool类:数据库连接池类. 运用单例模式,当要进行数据库操作时,先调用ConnectionPool.getInstance()方法,获取数据库连接池的实例,然后调用connectionPool.getConnection()方法获取数据库连接,使用完连接之后调用connectionPool.release(Connection conn)来代替connection.close()方法来将获得的连接释放到连接池中,以便重复利用。这样就解决了频繁打开和关闭数据库连接池的问题。
ConnectionPool.java
public class ConnectionPool {
private List<Connection> connections ;
private int poolSize = 1;//
private String url;
private String username;
private String password;
private String driverClassName;
private static ConnectionPool instance = null;
private ConnectionPool() {
initialize();
}
/**
* 初始化方法
*/
private void initialize() {
connections = new ArrayList<Connection>(poolSize);
readConfig();
addConnection();
}
/**
* 读取数据库连接池的配置文件
*/
private void readConfig() {
String path = System.getProperty("user.dir")+"/resources/config/jdbc.properties";
try {
FileInputStream is = new FileInputStream(path);
Properties prop = new Properties();
prop.load(is);
driverClassName = prop.getProperty("jdbc.driverClassName");
url = prop.getProperty("jdbc.url");
username = prop.getProperty("jdbc.username");
password = prop.getProperty("jdbc.password");
poolSize = Integer.parseInt(prop.getProperty("jdbc.poolSize"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 往数据库连接池中添加连接
*/
private void addConnection() {
for (int i=0; i < poolSize; i++) {
try {
Class.forName(driverClassName);
Connection connection = java.sql.DriverManager.getConnection(url, username, password);
connections.add(connection);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 获取数据库连接池
* @return
*/
public static ConnectionPool getConnectionPoolInstance() {
if (instance == null) instance = new ConnectionPool();
return instance;
}
/**
* 从数据库连接池中获取数据库连接
* @return
*/
public synchronized Connection getConnection() {
if (connections.size() <= 0) return null;
Connection connection = connections.get(0);
connections.remove(0);
return connection;
}
/**
* 释放数据库连接
* 使用完数据库连接池之后调用这个方法来代替close方法
* @param connection
*/
public synchronized void realase(Connection connection) {
connections.add(connection);
}
/**
* 关闭数据库连接池
*/
public synchronized void closePool() {
for (int i =0; i < connections.size(); i++) {
Connection connection = connections.get(i);
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connections.remove(i);
}
}
}
2. jdbc.propeties 数据库连接池配置文件,初始化数据库连接池时使用到。
jdbc.driverClassName=oracle.jdbc.xa.client.OracleXADataSource
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:mgodb
jdbc.username=CAR
jdbc.password=CAR
jdbc.poolSize=10
3. ConnectionPoolTest类: 测试类, 通过与不使用数据库连接池进行数据库访问所消耗的时间进行对比,为了使测试尽可能准确,通过100次循环调用,对比时间总和。
ConnectionPoolTest.java
public class ConnectionPoolTest extends TestCase {
public void testConnectionPoolTest() throws Exception {
String sql = "SELECT * FROM T_CR_CAR_TYPE_BRAND";
ConnectionPool connectionPool = null;
long starttime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
connectionPool = ConnectionPool.getConnectionPoolInstance();
Connection conn = connectionPool.getConnection();
ResultSet rs;
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
}
rs.close();
stmt.close();
rs = null;
stmt = null;
connectionPool.realase(conn);
}
connectionPool.closePool();
System.out.println("经过100次循环调用,使用连接池花费的时间:"
+ (System.currentTimeMillis() - starttime) + "ms\n");
String driverClassName = "oracle.jdbc.xa.client.OracleXADataSource";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:mgodb";
String username = "CAR";
String password = "CAR";
starttime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
Class.forName(driverClassName);
Connection conn = DriverManager.getConnection(url, username,
password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
}
rs.close();
stmt.close();
conn.close();
rs = null;
stmt = null;
conn = null;
}
System.out.println("经过100次循环调用,不使用连接池花费的时间:" + (System.currentTimeMillis() - starttime) + "ms\n");
}
}
通过测试结果可以发现,使用数据库连接池所消耗的实践要小于不使用数据库连接池的,当调用的次数增加时,差异将会更加明显。
当然这个数据库连接池仅仅是用来了解数据库连接池的原理而已,对于超时的连接并没有强制收回的机制,也没有限制用户调用close方法来关闭连接。仅供学习。。。。
分享到:
相关推荐
本项目“JSP毕业设计——JSP数据库连接池的研究与实现”显然聚焦于如何高效地管理和使用数据库资源,特别是通过数据库连接池来优化性能。 数据库连接池是现代Web应用中一个关键的组件,它的核心功能是管理数据库...
《基于嵌入式SQL的数据库连接池应用技术研究》探讨了在多层体系结构的应用程序环境中,如何通过数据库连接池技术提升系统性能和资源利用效率。本文主要关注的关键技术包括PL/SQL、多线程以及数据库连接池。 1. PL/...
使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在...
### 基于JDBC的数据库连接池技术研究 #### 一、引言 随着互联网技术的迅猛发展,特别是Web应用的广泛普及,传统的客户端/服务器(C/S)架构已经逐渐被浏览器/服务器(B/S)三层架构所取代。在这种背景下,为了提高...
《基于JDBC的数据库连接池技术研究与应用》 在当今互联网时代,Web应用程序的开发已经从传统的桌面应用转向了基于B/S架构的模式。Java的Servlet+JSP+JavaBean技术因其跨平台、安全、高效和可移植的特性,成为了开发...
数据库连接池是数据库管理中的重要概念,它在现代软件开发中扮演...在提供的"老韩之连接池"文件中,可能包含有关数据库连接池的详细讲解和PPT演示,建议仔细阅读和研究,这将对你的数据库管理和优化技能提升大有裨益。
Java数据库连接池是一种重要的技术,它在Java应用程序与数据库交互时起到了关键的作用。数据库连接池的概念是基于资源管理,它可以高效地管理和复用数据库连接,从而避免频繁创建和关闭连接导致的性能开销。在本项目...
dbutils库通常与其他的数据库接口模块(如psycopg2)一起使用,以创建和管理数据库连接池。 首先,我们来详细了解一下`dbutils`库。它主要包含以下几个组件: 1. **PooledDB**: 这是dbutils的核心部分,实现了连接...
数据库连接池是Java应用程序中非常重要的一个组件,它在处理...总之,这份源码提供了一个学习数据库连接池实现的实例,通过深入研究,可以加深对数据库连接池工作原理的理解,并有助于在实际项目中优化数据库访问性能。
数据库连接池是数据库管理中的重要组成部分,它在提高应用程序性能和资源管理方面起着关键作用。连接池的基本原理是预先创建一定数量的数据库连接,并将其保存在内存中,当应用程序需要与数据库通信时,不再直接建立...
本资源"JSP数据库连接池的研究与实现(源代码+论文)"提供了关于如何在JSP中有效地实施数据库连接池的深入理解和实践示例。 首先,我们要理解什么是数据库连接池。数据库连接池是预先初始化的一组数据库连接,应用...
综上所述,"JSP数据库连接池的研究与实现"项目涵盖了数据库连接池的重要性和使用方法,结合源代码和论文,为学习者提供了深入研究和实践的宝贵资源。对于Java Web开发者来说,理解和掌握这一技术对于提升项目性能和...
数据库连接池技术在分布式系统中的应用研究不仅涵盖了连接池的基本原理和优势,还比较了连接池技术与传统的数据库连接的区别。连接池技术相比传统数据库连接方式的优势主要体现在以下几个方面: 1. 连接重用:连接...
基于JSP毕业设计-数据库连接池的研究与实现(源代码+论文).zip 在基于JDBC的数据库实际应用开发中,对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作、多客户对数据库的并发访问,一定程度上...
数据库连接池是数据库管理中的重要组成部分,主要用于优化数据库的连接创建、分配和释放,从而提高系统性能和资源利用率。在Java开发中,常见的数据库连接池实现有三种:C3P0、DBCP和HikariCP。下面将详细介绍这三种...