java_Tomcat_连接池之入门与应用

本文介绍了数据库连接池的基本原理,强调了资源重用和高效响应的特点。接着,通过Java实现简单连接池,展示了如何配置和使用Tomcat连接池,以及如何在项目中整合dbcp连接池。提供了相关的配置教程和开源数据库连接池的使用体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继上一次为系统增加缓存以后,现在开始为系统增加连接池。

文章安排如下:

  1. 简要介绍连接池的基本原理
  2. Java实现简单的连接池
  3. 配置和使用Tomcat连接池
  4. 使用dbcp作为连接池
  5. dbcp与Spring整合

1.基本原理

数据库连接池的基本原理是在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。当程序中需要建立数据库连接时,只需从内存中获取一个数据库连接来用,而不是新建一个数据库连接,在使用完毕后,只需放回内存既可。对于连接的建立和断开都由连接池自己管理。

综上所述,连接池具有如下特点:

  • 资源重用:为了避免频繁地创建、释放数据库连接,实现了数据库连接的重用
  • 高效的系统响应:数据库连接池在初始化过程中,一般就会创建若干个数据库连接存储在池中备用,所以具有很高的效率
  • 统一的连接管理:对于连接数目的创建、断开、管理和关闭等操作都是由数据库连接池统一管理

2.Java实现

数据库连接池ConncetionPool.java
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector;


public class ConnectionPool {
	private Vector<Connection> pool;
	private String url;
	private String username;
	private String password;
	private String driverClassName;
	private int poolSize = 1;
	private static ConnectionPool _CP = null;
	private ConnectionPool()
	{
		init();
	}
	private void init()
	{
		pool = new Vector<Connection>(poolSize);
		readConfig();
		addConnection();
	}
	public synchronized void release(Connection conn)
	{
		pool.add(conn);
	}
	public synchronized void closePool()
	{
		for(int i=0;i<pool.size();i++)
		{
			try {
				pool.get(i).close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			pool.remove(i);
		}
	}
	public synchronized Connection getConnection()
	{
		if(pool.size()>0)
		{
			Connection conn = pool.get(0);
			pool.remove(conn);
			return conn;
		}
		else return null;
	}
	public static ConnectionPool getInstance()
	{
		if(_CP == null)
			_CP = new ConnectionPool();
		return _CP;
	}
	private void addConnection()
	{
		Connection conn = null;
		for(int i=0;i<poolSize;i++)
		{
			try {
				Class.forName(driverClassName);
				conn = java.sql.DriverManager.getConnection(url,username,password);
				pool.add(conn);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	private void readConfig()
	{
		Properties mp = new Properties();
		try {
			mp.load(ConnectionPool.class.getResourceAsStream("/conf/dbpool.properties"));
			
			this.driverClassName = mp.getProperty("driverClassName");
			this.username = mp.getProperty("username");
			this.password = mp.getProperty("password");
			this.url = mp.getProperty("url");
			this.poolSize = Integer.parseInt(mp.getProperty("poolSize"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
dbpool.properties
driverClassName = com.mysql.jdbc.Driver
username = root
password = 123
url = jdbc:mysql://127.0.0.1:3306/autotest?useUnicode=true&characterEncoding=utf8&autoReconnect=true
poolSize = 10
ConnectionPoolTest.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.iueye.dal.ConnectionPool;

public class ConnectionPoolTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		String sql = "select * from module ";
		long start = System.currentTimeMillis();
		ConnectionPool pool = null;
		for(int i=0;i<100;i++)
		{
			pool = ConnectionPool.getInstance();
			Connection conn = pool.getConnection();		
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			while(rs.next()){}
			rs.close();
			stmt.close();
			pool.release(conn);
		}
		pool.closePool();
		System.out.println("经过100次的循环调用,使用连接池花费的时间:"+(System.currentTimeMillis()-start)+"ms\n");
		
		String hostname = "127.0.0.1";
		String driverClass = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://127.0.0.1:3306/autotest";
		String user = "root";
		String password = "123";
		start = System.currentTimeMillis();
		for(int i=0;i<100;i++)
		{
			Class.forName(driverClass);
			Connection conn = DriverManager.getConnection(url,user,password);
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			while(rs.next()){}
			rs.close();
			stmt.close();
			conn.close();
		}
		System.out.println("经过100次的循环调用,不使用连接池花费的时间:"+(System.currentTimeMillis()-start)+"ms\n");
	}

}
运行结果:
经过100次的循环调用,使用连接池花费的时间:531ms

经过100次的循环调用,不使用连接池花费的时间:1062ms

3.配置和使用Tomcat连接池

在Tomcat-Home/conf/context.xml中加入
<Resource name="jdbc/autotest" type="javax.sql.DataSource" 
			  driverClassName="com.mysql.jdbc.Driver" auth="Container"
			  username="root" password="123"
			  url="jdbc:mysql://127.0.0.1:3306/autotest"
			  maxIdle="2" maxActive="4" />
在ProjectPath/WebContent/WEB-INF/web.xml中加入
<resource-ref>
		<description>MySQL Connection Pool</description>
		<res-ref-name>jdbc/autotestL</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
编写测试页面test.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page import="javax.sql.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print("Start<br/>");
try{
	String sql = "select * from module ";
	Context initCtx = new InitialContext();
	Context envCtx = (Context)initCtx.lookup("java:comp/env");
	DataSource ds = (DataSource)envCtx.lookup("jdbc/autotest");
	Connection conn = ds.getConnection();
	out.print("MySQL connection pool runs perfectly!");
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	out.print("<br/>");
	out.print("<table border='1'>");
	while(rs.next()){
		out.print("<tr><td>"+rs.getInt(1)+"</td>");
		out.print("<td>"+rs.getString(2)+"</td>");
		out.print("<td>"+rs.getInt(3)+"</td></tr>");
	}
	out.print("</table>");
	rs.close();
	stmt.close();
	conn.close();
}catch(Exception ex)
{
	out.print(ex.getMessage());
	ex.printStackTrace();
}
%>
</body>
</html>
test.jsp页面结果显示:
Start
MySQL connection pool runs perfectly!
1基础功能-1
2聚合功能-1
3应用功能-1
4乐园接口-1
5注册登录1
6好友1
7设置1

4.使用dbcp作为连接池

我们知道Tomcat默认使用dbcp作为其连接池
NOTE  - The default data source support in Tomcat is based on the  DBCP  connection pool from the Commons  project. However, it is possible to use any other connection pool that implements javax.sql.DataSource , by writing your own custom resource factory, as described  below .



参考文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值