首頁 資料庫 mysql教程 MySql数据库连接池_MySQL

MySql数据库连接池_MySQL

Jun 01, 2016 pm 01:02 PM
資料庫

1.传统链接(如下为示意图)

\

注意:

(1).传统方式找DriverManager要连接,数目是有限的。

(2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行

(3).项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式。

2.采用连接池(示意图)

\

3.开源数据库连接池

(1).现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
(2).也有一些开源组织提供了数据源的独立实现:
DBCP 数据库连接池(tomcat)
C3P0 数据库连接池(hibernate)
(3).实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

4.C3P0的使用:
(1).在classpath的路径下配置xml文件,即src的文件下而且这个文件名必须是c3p0-config.xml

原始的c3p0-config.xml的文件参数:

<c3p0-config>
	<default-config>
		<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
		<property name="acquireIncrement">3</property>

		<!-- 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
		<property name="acquireRetryAttempts">30</property>

		<!-- 两次连接中间隔时间,单位毫秒。Default: 1000 -->
		<property name="acquireRetryDelay">1000</property>

		<!-- 连接关闭时默认将所有未提交的操作回滚。Default: false -->
		<property name="autoCommitOnClose">false</property>

		<!--
			c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
			属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default:
			null
		-->
		<property name="automaticTestTable">Test</property>

		<!--
			获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
			保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
			获取连接失败后该数据源将申明已断开并永久关闭。Default: false
		-->
		<property name="breakAfterAcquireFailure">false</property>

		<!--
			当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
			SQLException,如设为0则无限期等待。单位毫秒。Default: 0
		-->
		<property name="checkoutTimeout">100</property>

		<!--
			通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 Default:
			com.mchange.v2.c3p0.impl.DefaultConnectionTester
		-->
		<property name="connectionTesterClassName"></property>

		<!--
			指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 Default: null
		-->
		<property name="factoryClassLocation">null</property>

		<!--
			Strongly disrecommended. Setting this to true may lead to subtle and
			bizarre bugs. (文档原文)作者强烈建议不使用的一个属性
		-->
		<property name="forceIgnoreUnresolvedTransactions">false</property>

		<!-- 每60秒检查所有连接池中的空闲连接。Default: 0 -->
		<property name="idleConnectionTestPeriod">60</property>

		<!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
		<property name="initialPoolSize">3</property>

		<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
		<property name="maxIdleTime">60</property>

		<!-- 连接池中保留的最大连接数。Default: 15 -->
		<property name="maxPoolSize">15</property>

		<!--
			JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
			属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
			如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
		-->
		<property name="maxStatements">100</property>

		<!--
			maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0
		-->
		<property name="maxStatementsPerConnection"></property>

		<!--
			c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
			通过多线程实现多个操作同时被执行。Default: 3
		-->
		<property name="numHelperThreads">3</property>

		<!--
			当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 的数据源时。Default:
			null
		-->
		<property name="overrideDefaultUser">root</property>

		<!-- 与overrideDefaultUser参数对应使用的一个参数。Default: null-->
		<property name="overrideDefaultPassword">password</property>

		<!-- 密码。Default: null-->
		<property name="password"></property>

		<!--
			定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:
			测试的表必须在初始数据源的时候就存在。Default: null
		-->
		<property name="preferredTestQuery">select id from test where id=1
		</property>

		<!-- 用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
		<property name="propertyCycle">300</property>

		<!--
			因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
			时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
			等方法来提升连接测试的性能。Default: false
		-->
		<property name="testConnectionOnCheckout">false</property>

		<!-- 如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
		<property name="testConnectionOnCheckin">true</property>

		<!-- 用户名。Default: null-->
		<property name="user">root</property>

		<!--
			早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到支持,但今后可能的版本可能不支持动态反射代理。Default:
			false。
		-->
		<property name="usesTraditionalReflectiveProxies">false</property>
		<property name="automaticTestTable">con_test</property>
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">25</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">0</property>
		<user-overrides user="swaldman">
		</user-overrides>
	</default-config>
	<named-config name="dumbTestConfig">
		<property name="maxStatements">200</property>
		<user-overrides user="poop">
			<property name="maxStatements">300</property>
		</user-overrides>
	</named-config>
</c3p0-config>
登入後複製
实战练习:
1>.首先配置c3p0-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">wwh</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/jdbctest</property>
	</default-config>
</c3p0-config>
登入後複製
2>.代码操作连接(TestC3P0.java)
package cn.wwh.www.java.jdbc.datasource;

import java.sql.Connection;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 *类的作用:
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-9-2   上午12:02:13
 */

//测试连接池C3P0的用法
public class TestC3P0 {
	public static void main(String[] args) throws Exception {
		long begin = System.currentTimeMillis();
		//创建C3P0连接池,并加载c3p0-config.xml文件
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		for(int i=1;i<=1000000;i++){
			Connection conn = dataSource.getConnection();
			if(conn!=null){
				System.out.println("获取连接第"+i+"个");
				conn.close();
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("用了" + (end-begin)/1000+"秒");
	}
}
登入後複製

5.DBCP的使用:
(1).采用类加载的方式,文件名是:dbcp.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/jdbctest
username=root
password=wwh
登入後複製
(2).在代码中使用(TestDBCP.java)
package cn.wwh.www.java.jdbc.datasource;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

/**
 *类的作用:采用DBCP连接池的方式去获取数据库的链接,并测试他的时间
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-9-1   下午09:27:59
 */

//测试连接池DBCP的用法
public class TestDBCP {
	public static void main(String[] args) throws Exception {
		long begin = System.currentTimeMillis();
		//加载属性文件
		InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("cn/wwh/www/java/jdbc/config/dbcp.properties");
		Properties props = new Properties();
		props.load(is);
		//创建DBCP连接池工厂
		BasicDataSourceFactory factory = new BasicDataSourceFactory(); 
		//创建数据源,即连接池
		DataSource ds = factory.createDataSource(props);
		for(int i=1;i<=1000000;i++){
			//从连接池中取得一个空闲的连接对象
			Connection conn = ds.getConnection();
			if(conn!=null){
				System.out.println("获取连接第"+i+"个");
			}
			//将连接对象还回给连接池
			conn.close();
		}
		long end = System.currentTimeMillis();
		System.out.println("用了" + (end-begin)/1000+"秒");
	}
}
登入後複製
第一的测试时间为18秒,第二个的测试时间为13秒,不同的机器性能不一样,测试的时间快慢也不可能。但是理论上C3P0的速度应该更快,但是我测试的数据却恰恰相反,很是奇怪。

总结:

1>DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口
2>DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包
3>C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时
会自动在指定的目录下找xml文件,并加载默认设置

4>tomcat用的也是c3p0

6.导入的jar包

commons-dbcp.jar:DBCP实现要导入的jar

commons-pool.jar: 连接池实现的依赖类

commons-collections.jar :连接池实现的集合类

c3p0-0.9.1.2.jar :C3P0实现要导入的jar包

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

Hibernate 如何實作多型映射? Hibernate 如何實作多型映射? Apr 17, 2024 pm 12:09 PM

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

如何在PHP中處理資料庫連線錯誤 如何在PHP中處理資料庫連線錯誤 Jun 05, 2024 pm 02:16 PM

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

如何在 Golang 中使用資料庫回呼函數? 如何在 Golang 中使用資料庫回呼函數? Jun 03, 2024 pm 02:20 PM

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。

如何在 Golang 中將 JSON 資料保存到資料庫中? 如何在 Golang 中將 JSON 資料保存到資料庫中? Jun 06, 2024 am 11:24 AM

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

如何用 Golang 連接遠端資料庫? 如何用 Golang 連接遠端資料庫? Jun 01, 2024 pm 08:31 PM

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。

PHP與不同資料庫的連接:MySQL、PostgreSQL、Oracle和更多 PHP與不同資料庫的連接:MySQL、PostgreSQL、Oracle和更多 Jun 01, 2024 pm 03:02 PM

PHP連接資料庫指南:MySQL:安裝MySQLi擴展,建立連線(servername、username、password、dbname)。 PostgreSQL:安裝PgSQL擴展,建立連線(host、dbname、user、password)。 Oracle:安裝OracleOCI8擴展,建立連線(servername、username、password)。實戰案例:取得MySQL資料、PostgreSQL查詢、OracleOCI8更新記錄。

See all articles