大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java連接池詳解

Java連接池詳解

更新時間:2022-11-17 11:15:54 來源:動力節點 瀏覽2232次

連接池是指連接對象池。連接池基于對象池設計模式。當創建新對象的成本(時間和資源,如 CPU、網絡和 IO)較高時,使用對象池設計模式。根據對象池設計模式,應用程序預先創建一個對象并將它們放置在池或容器中。每當我們的應用程序需要此類對象時,它都會從池中獲取它們,而不是創建一個新對象。

使用連接池策略的應用程序已經具有可以重用的數據庫連接對象。所以,當需要與數據庫進行交互時,應用程序從Pool中獲取連接實例。連接池提高了與數據庫交互的應用程序性能。

Java 應用程序中的連接池

讓我們看看下面的庫:

Apache Commons DBCP 2

光CP

C3P0

讓我們一個一個地看下面的例子。出于演示目的,我們將使用 MySQL 數據庫和 Eclipse IDE。我們還將使用 JDK 1.8 創建基于 Maven 的簡單 Java 項目。

數據庫腳本

create database empdb;
use empdb;
create table tblemployee(
                    empId integer AUTO_INCREMENT primary key,
                    empName varchar(64),
                    dob date,
                    designation varchar(64)
);
insert into  tblemployee(empId,empName,dob,designation) values (default,'Adam','1998-08-15','Manager');
insert into  tblemployee(empId,empName,dob,designation) values (default,'Smith','2001-01-11','Clerk');
insert into  tblemployee(empId,empName,dob,designation) values (default,'James','1996-03-13','Officer');

示例項目

按照以下步驟創建新項目。

打開 Eclipse 集成開發環境。

單擊文件菜單并選擇新建 -> Maven 項目

將顯示以下屏幕。選擇創建一個簡單的項目選項并單擊下一步按鈕。

輸入任何組 ID、工件 ID、名稱和描述。

單擊完成按鈕。

在 MySQL 的 pom.xml 中添加以下依賴項。

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.49</version>
</dependency>

右鍵單擊項目,選擇 Maven -> 更新項目 -> 確定。它將下載所有依賴項。

Apache DBCP 2

DBCP 來自 Apache Common Project。DBCP 2.7 需要 Java 8。要使用 DBCP 2,您需要在項目中添加以下依賴項。

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-dbcp2</artifactId>
	<version>2.7.0</version>
</dependency>

Apache DBCP 2.0 提供了兩種類型的數據源(BasicDataSource 和 PoolingDataSource)。

BasicDataSource:顧名思義,它很簡單,適用于大多數常見的用例。它在內部為我們創建了 PoolingDataSource。

讓我們看看以下初始化連接池的步驟。

創建 BasicDataSource 的實例

指定 JDBC Url、數據庫用戶名和密碼

指定最小空閑連接數(Minimum number of connections that need to remain in the pool anytime)

指定最大空閑連接數(Maximum number of Idle connection in the pool)

指定最大連接總數。

package com.journaldev.example;
/**
 * Java JDBC Connection pool using Apache commons DBCP2 example program
 * 
 * @author pankaj
 */
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;
public class DBCP2Demo {
	private static BasicDataSource dataSource = null;
	static {
		dataSource = new BasicDataSource();
		dataSource.setUrl("jdbc:mysql://localhost:3306/empdb?useSSL=false");
		dataSource.setUsername("root");
		dataSource.setPassword("root");
		dataSource.setMinIdle(5);
		dataSource.setMaxIdle(10);
		dataSource.setMaxTotal(25);
	}
public static void main(String[] args) throws SQLException {
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			connection = dataSource.getConnection();
			statement = connection.createStatement();
			resultSet = statement.executeQuery("select * from tblemployee");
			while (resultSet.next()) {
				System.out.println("empId:" + resultSet.getInt("empId"));
				System.out.println("empName:" + resultSet.getString("empName"));
				System.out.println("dob:" + resultSet.getDate("dob"));
				System.out.println("designation:" + resultSet.getString("designation"));
			}
		} finally {
			resultSet.close();
			statement.close();
			connection.close();
		}
	}
}

輸出:

empId:1
empName:Adam
dob:1998-08-15
designation:Manager
empId:2
empName:Smith
dob:2001-01-11
designation:Clerk
empId:3
empName:James
dob:1996-03-13
designation:Officer

PoolingDataSource:它提供了更多的靈活性。您只需要更改創建數據源的代碼。其余代碼將保持不變。

讓我們看一下初始化連接池的以下步驟:

使用 JDBC URL 創建 ConnectionFactory 的實例。

使用在步驟 1 中創建的 ConnectionFactory 實例創建 PoolableConnectionFactory 實例

創建 GenericObjectPoolConfig 的實例并設置最大空閑、最小空閑和最大連接屬性

現在使用在步驟 2 和步驟 3 中創建的實例初始化 ObjectPool

現在將池設置為 PoolableConnectionFactory 的實例

最后,初始化DataSource的一個實例

private static DataSource dataSource = null;
	static {
		Properties properties = new Properties();
		properties.setProperty("user", "root");
		properties.setProperty("password", "root");
		ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://localhost:3306/empdb",
				properties);
		PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null);
		GenericObjectPoolConfig<PoolableConnection> config = new GenericObjectPoolConfig<>();
		config.setMaxTotal(25);
		config.setMaxIdle(10);
		config.setMinIdle(5);
		ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolableConnectionFactory, config);
		poolableConnectionFactory.setPool(connectionPool);
		dataSource = new PoolingDataSource<>(connectionPool);
	}

HikariCP

HikariCP 快速、可靠且簡單。它是連接池的首選解決方案之一。像 Spring Boot 2.x 這樣的框架使用它作為默認的連接管理器。

要使用 HikariCP,請在我們項目的 pom.xml 中添加以下依賴項。

<dependency>
	<groupId>com.zaxxer</groupId>
	<artifactId>HikariCP</artifactId>
	<version>3.4.5</version>
</dependency>

HikariCP 配置:

我們可以使用基于 Java 的配置,如下面的示例程序所示,或者我們可以使用屬性文件來配置 HikariCP。讓我們看看下面的屬性。

idleTimeout:連接對象可以在池中保持空閑狀態的時間(以毫秒為單位)。它適用于minimumIdle和maximumPoolSize屬性。在指定的時間后連接對象將被釋放。

connectionTimeout:客戶端等待來自池的連接對象的時間(以毫秒為單位)。如果達到時間限制,則將拋出 SQL 異常。

autoCommit : 我們可以指定 true 或 false ,如果設置為 true 那么它會自動提交你執行的每條 SQL 語句,如果設置為 false 那么我們需要手動提交 SQL 語句

cachePrepStmts:為 Prepare Statement 啟用緩存

minimumIdle:任何時候連接池中需要保留的最少連接對象數。

maximumPoolSize:可以保留在池中的最大連接數。

package com.journaldev.example;
/**
 * Java JDBC Connection pool using HikariCP example program
 * 
 * @author pankaj
 */
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class HikariCPDemo {
	private static HikariDataSource dataSource = null;
	static {
		HikariConfig config = new HikariConfig();
		config.setJdbcUrl("jdbc:mysql://localhost:3306/empdb");
		config.setUsername("root");
		config.setPassword("root");
		config.addDataSourceProperty("minimumIdle", "5");
		config.addDataSourceProperty("maximumPoolSize", "25");
		dataSource = new HikariDataSource(config);
	}
	public static void main(String[] args) throws SQLException {
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			connection = dataSource.getConnection();
			statement = connection.createStatement();
			resultSet = statement.executeQuery("select * from tblemployee");
			while (resultSet.next()) {
				System.out.println("empId:" + resultSet.getInt("empId"));
				System.out.println("empName:" + resultSet.getString("empName"));
				System.out.println("dob:" + resultSet.getDate("dob"));
				System.out.println("designation:" + resultSet.getString("designation"));
			}
		} finally {
			resultSet.close();
			statement.close();
			connection.close();
		}
	}
}

輸出:

empId:1
empName:Adam
dob:1998-08-15
designation:Manager
empId:2
empName:Smith
dob:2001-01-11
designation:Clerk
empId:3
empName:James
dob:1996-03-13
designation:Officer

C3P0

通常,它與 Hibernate 一起使用。要使用 C3P0,我們需要在項目中添加以下依賴。

<dependency>
	<groupId>com.mchange</groupId>
	<artifactId>c3p0</artifactId>
	<version>0.9.5.5</version>
</dependency>

我們可以使用 C3P0 配置以下屬性。

driverClass:首選 Jdbc 驅動程序

jdbcUrl:數據庫的 JDBC Url。

initialPoolSize:啟動時在池中創建的連接數。

acquireIncrement:當前大小不夠時需要創建的新連接數。

maxIdleTime:連接可以保留在池中而不被使用的秒數。

maxPoolSize:可以保留在 Pool 中的最大連接數。

minPoolSize:任何時候Pool中需要保留的最小連接對象數。

package com.journaldev.example;
/**
 * Java JDBC Connection pool using C3PO example program
 * 
 * @author pankaj
 */
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Demo {
	static ComboPooledDataSource comboPooledDataSource = null;
	static {
		comboPooledDataSource = new ComboPooledDataSource();
		comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/empdb?useSSL=false");
		comboPooledDataSource.setUser("root");
		comboPooledDataSource.setPassword("root");
		comboPooledDataSource.setMinPoolSize(3);
		comboPooledDataSource.setAcquireIncrement(3);
		comboPooledDataSource.setMaxPoolSize(30);
	}
public static void main(String[] args) throws SQLException {
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			connection = comboPooledDataSource.getConnection();
			statement = connection.createStatement();
			resultSet = statement.executeQuery("select * from tblemployee");
			while (resultSet.next()) {
				System.out.println("empId:" + resultSet.getInt("empId"));
				System.out.println("empName:" + resultSet.getString("empName"));
				System.out.println("dob:" + resultSet.getDate("dob"));
				System.out.println("designation:" + resultSet.getString("designation"));
			}
		} finally {
			resultSet.close();
			statement.close();
			connection.close();
		}
	}
}

輸出:

Aug 29, 2020 8:59:05 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge9kqacgbp7hjpftse6|77a567e1, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge9kqacgbp7hjpftse6|77a567e1, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/empdb?useSSL=false, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 30, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
empId:1
empName:Adam
dob:1998-08-15
designation:Manager
empId:2
empName:Smith
dob:2001-01-11
designation:Clerk
empId:3
empName:James
dob:1996-03-13
designation:Officer

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 99视频全部免费精品全部四虎 | 一区二区三区在线观看视频 | 毛片毛片毛片毛片毛片 | 欧美日韩中文字幕在线观看 | 西西做人爱免费视频 | 国产精品21区| 日韩xx00| 99色精品| 免费黄色毛片视频 | 久久免费网 | 天天舔天天操天天干 | 日本免费一区二区三区中文 | 日韩一区二区三区免费视频 | 在线欧洲成人免费视频 | 欧做爰xxxⅹ性欧美大片孕妇 | 日本一区二区三区不卡在线视频 | 一级毛片短视频 | 性短视频在线观看免费不卡流畅 | 久久国产亚洲欧美日韩精品 | 欧美一级成人毛片影院 | 亚洲精品综合一二三区在线 | 偷偷鲁影院手机在线观看 | 欧美70一80老妇性大片 | 亚洲成色999久久网站 | 久久www免费人成精品香蕉 | 色婷婷.com | 精品久久久久久久中文字幕 | 国产视频久久久久 | 91精品国产欧美一区二区 | 四虎成人www国产精品 | 亚洲国产午夜精品理论片的软件 | 国产成人一区在线播放 | 亚洲成人中文字幕 | 久操伊人 | 亚洲欧美不卡中文字幕 | 久久激情综合网 | 99日精品欧美国产 | 人人爱天天做夜夜爽2020麻豆 | 99热这里有精品 | 99热久久国产精品 | 天天草夜夜骑 |