JavaWeb后端入门2—连接池

1.概述1.1 什么是连接池创建和管理一个连接的缓冲池的技术。是装有连接的容器,使用连接的时候可以从连接池中进行获取,使用完成后将连接归还给连接池1.2 为什么要学习连接对象创建和销毁是需要好费时间的,在服务器初始化的时候就初始化一些连接。

JavaWeb后端入门2—连接池

1.概述

1.1 什么是连接池

创建和管理一个连接的缓冲池的技术。

是装有连接的容器,使用连接的时候可以从连接池中进行获取,使用完成后将连接归还给连接池

1.2 为什么要学习

连接对象创建和销毁是需要好费时间的,在服务器初始化的时候就初始化一些连接。把这些对象连接放入到内存中,使用的时候可以从内存中获取,使用完成后将连接放入到连接池中。将内存中获取和归还的效率要远远高于创建和销毁的效率(提升性能)。

1.3 连接池的原理

2. 自定义连接池

2.1 实现步骤

  • 编写类实现Datasource接口
  • 重写getConnection方法
  • 在内存中初始化多个连接
  • 编写归还连接的方法

2.2 实现代码

  • 写一个MyDataSource方法
代码语言:javascript代码运行次数:0运行复制
public class MyDataSource implements DataSource {
//将一些连接存入到内存中,可以定义一个集合,用于存储连接对象。
	private List<Connection> connList = new ArrayList<Connection>();
	//在初始化的时候提供一些连接
	public MyDataSource() {
		//初始化连接:
		for(int i =1 ;i<=3;i++) {
			//向集合中存入链接
			connList.add(JDBCUtils.getConnection());
		}
	}
	//从连接池中获得链接的方法
	@Override
	public Connection getConnection() throws SQLException {
		Connection conn = connList.remove(0);
		return conn;
	}

	// 编写归还连接的方法
	public void addBack(Connection conn) {
		connList.add(conn);
	}
....}
  • 测试代码
代码语言:javascript代码运行次数:0运行复制
package com.itheima.datasource.demo1;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.itheima.jdbc.utils.JDBCUtils;

/*
 * 自定义连接池的测试类
 * */
public class DataSourceDemo1 {
	@Test
	/* 测试自定义连接池 */
	public void demo1() {
		// 记录一下插入数据使用的时间
		// 开始时间
		long begin = System.currentTimeMillis();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		MyDataSource dataSource = null;
		try {
			// 获得连接
//			 conn = JDBCUtils.getConnection();
			// 从连接池中获得连接
			dataSource = new MyDataSource();
			conn = dataSource.getConnection();
			// 编写SQL语句
			String sql = "select * from account";
			// 预编译SQL
			pstmt = conn.prepareStatement(sql);
			// 设置参数
			// 执行SQL
			rs = pstmt.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
//			 JDBCUtils.release(rs,pstmt, conn);
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (SQLException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			// 归还连接
			dataSource.addBack(conn);
		}
		long end = System.currentTimeMillis();
		System.out.print("数据插入时间为(单位ms):");
		System.out.println(end - begin);
	}
}

3. C3P0连接池

3.1 概述

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等

参考文档:/

3.2 使用方法1:手动设置参数

首先引入c3p0-0.9.1.2.jar

代码语言:javascript代码运行次数:0运行复制
package com.itheima.datasource.demo2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.sql.DataSource;

import org.junit.Test;

import com.itheima.jdbc.utils.JDBCUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/*
 * C3P0连接池测试
 * */
public class C3P0Demo1 {
	@Test
	// 手动设置参数的方式
	public void demo1() {
		// 记录一下插入数据使用的时间
		// 开始时间
		long begin = System.currentTimeMillis();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			// 获得链接:从连接池中获取
			// 创建c3p0的连接池
			ComboPooledDataSource dateSource = new ComboPooledDataSource();
			// 设置连接参数
			dateSource.setDriverClass("com.mysql.jdbc.Driver");
			dateSource.setJdbcUrl("jdbc:mysql://43.226.152.21:3306/web_test4");
			dateSource.setUser("root");
			dateSource.setPassword("Qq1991101313");
			// 从连接池中获得链接
			conn = dateSource.getConnection();
			// 编写sql
			String sql = "select * from account1";
			// 预编译SQL
			pstmt = conn.prepareStatement(sql);
			// 执行SQL
			rs = pstmt.executeQuery();
			// 遍历结果集
			while (rs.next()) {
				System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, pstmt, conn);
		}
		long end = System.currentTimeMillis();
		System.out.print("数据插入时间为(单位ms):");
		System.out.println(end - begin);
	}
}

3.3 使用方法2:使用配置文件

  • 在src目录下创建c3p0-config.xml文件(点击查看官方示例代码)
代码语言:javascript代码运行次数:0运行复制
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://x.x.x.x:3306/web_test4</property>
		<property name="user">root</property>
		<property name="password">xxx</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
	</default-config>

	<!-- This app is massive! -->
	<named-config name="oracle">
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://x.x.x.x:3306/web_test4</property>
		<property name="user">root</property>
		<property name="password">xxx</property>
	</named-config>
</c3p0-config>
  • 代码框架同3.2,这里只重写Demo2
代码语言:javascript代码运行次数:0运行复制
@Test
	/*
	 * 采用配置文件的方式
	 */
	public void demo2() {
		// 记录一下插入数据使用的时间
		// 开始时间
		long begin = System.currentTimeMillis();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			// 创建C3P0连接池
			/*
			 * 只要创建连接池,就会默认去类路径下查找c3p0-config.xml
			 */
			ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");
			// 从连接池获得链接
			conn = dataSource.getConnection();
			// 编写SQL
			String sql = "select * from account";
			// 预编译SQL
			pstmt = conn.prepareStatement(sql);
			// 执行SQL
			rs = pstmt.executeQuery();
			// 遍历结果集
			while (rs.next()) {
				System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, pstmt, conn);
		}
		long end = System.currentTimeMillis();
		System.out.print("数据插入时间为(单位ms):");
		System.out.println(end - begin);
	}

4. 改写工具类

连接池对象应该是一个应用只创建一次,不需要每次使用都创建一个新的连接池。

  • 提取出JDBCUtils2.java

不需要之前的注册驱动和获得链接了,直接创建C3P0连接池,给出获得链接的方法。

代码语言:javascript代码运行次数:0运行复制
package com.itheima.jdbc.utils;
/*JDBC工具类*/


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtils2 {
	/**创建一个连接池:只创建一次*/
	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
	/**
	 *获得链接的方法 
	 * @throws SQLException 
	 **/
	public static Connection getConnection() throws SQLException {
			return dataSource.getConnection();
	}
	
	/**
	 * 获得连接池
	 * */
	public static DataSource getDataSource() {
		return dataSource;
	}
	/**
	 *资源释放的方法 
	 **/
	public static void release(Statement stmt,Connection conn) {
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			stmt = null;
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			conn = null;
		}
	}
	public static void release(ResultSet rs,Statement stmt,Connection conn) {
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			stmt = null;
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			conn = null;
		}
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			rs = null;
		}
	}
}
  • 测试提取出的工具类
代码语言:javascript代码运行次数:0运行复制
@Test
	/**
	 * 使用新的工具类的测试
	 */
	public void demo1() {

		// 记录一下插入数据使用的时间
		// 开始时间
		long begin = System.currentTimeMillis();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			/** 不用创建连接池了 */
			// 从连接池获得链接
			conn = JDBCUtils2.getConnection();
			// 编写SQL
			String sql = "select * from account";
			// 预编译SQL
			pstmt = conn.prepareStatement(sql);
			// 执行SQL
			rs = pstmt.executeQuery();
			// 遍历结果集
			while (rs.next()) {
				System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, pstmt, conn);
		}
		long end = System.currentTimeMillis();
		System.out.print("数据插入时间为(单位ms):");
		System.out.println(end - begin);
	}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-08 ,如有侵权请联系 cloudcommunity@tencent 删除入门数据后端连接内存

发布者:admin,转转请注明出处:http://www.yc00.com/web/1748000233a4717302.html

相关推荐

  • JavaWeb后端入门2—连接池

    1.概述1.1 什么是连接池创建和管理一个连接的缓冲池的技术。是装有连接的容器,使用连接的时候可以从连接池中进行获取,使用完成后将连接归还给连接池1.2 为什么要学习连接对象创建和销毁是需要好费时间的,在服务器初始化的时候就初始化一些连接。

    6小时前
    10

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信