黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

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

Java連接池詳解

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

連接池是指連接對象池。連接池基于對象池設計模式。當創建新對象的成本(時間和資源,如 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

 

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日本国产在线观看 | 国产在线精品观看一区 | 日本天堂网在线 | 国产精品日韩欧美在线 | 日本久久久久久久中文字幕 | 国产无套粉嫩白浆在线精品 | 插菊网 | 日韩小视频网站 | 久草在现| 久久天天躁狠狠躁夜夜2020一 | 日韩一级黄色录像 | 国产一区二区在线观看视频 | 久久艹精品 | 黄色小视频在线播放 | 欧美激情一区二区亚洲专区 | 日韩精品影院 | 翁熄性荡事最新篇王伟忠 | 亚洲18av| 色噜噜噜噜色 | 日韩在线观看不卡 | 爆操欧美美女 | 日韩亚洲欧美在线 | 国产亚洲午夜精品 | 免费看国产一级片 | 在线播放你懂得 | 在线播放 你懂的 | 很黄很黄很刺激的视频免费 | 黑人一区二区三区中文字幕 | 亚洲第一页视频 | 中文字幕免费在线 | 国产精品久久久久久久久鸭 | 国产精品高清一区二区三区不卡 | 久久首页 | 色偷偷.com | 91精品国产高清久久久久久91 | 欧美v亚洲| 久久久午夜精品理论片 | 成人精品一区二区三区中文字幕 | 91久久综合精品国产丝袜长腿 | 九九九精品视频 | 欧美成人黄色片 |