データベース接続プール
JDBCデータベース接続プールの必要性
データベースベースのWebプログラムを使用および開発する場合、従来のモデルは基本的に次の手順に従います。
- メインプログラム(サーブレットBeanなど)でデータベース接続を確立します
- SQL操作を実行します
- データベース接続を切断します
この開発モードの問題:
- 通常のJDBCデータベース接続は、DriverManagerを使用して取得されます。データベースへの接続が確立されるたびに、接続をメモリにロードし、ユーザー名とパスワードを確認する必要があります(約0.05s-1s)。必須の場合、データベースは1つを要求し、実行が完了した後に切断します。この方法は多くの時間を消費します。データベースの接続リソースは十分に活用されていません。
- データベース接続ごとに、使用後に切断する必要があります。そうしないと、プログラムが異常のために閉じられない場合、データベースシステムでメモリリークが発生し、最終的にデータベースが再起動されます。
- この種の開発では、作成される接続オブジェクトの数を制御できず、システムリソースが無謀に割り当てられます。接続が多すぎると、メモリリークやサーバーのクラッシュが発生する可能性もあります。
データベース接続プールテクノロジの
基本的な考え方:データベース接続用の「バッファプール」を確立します。事前に一定数の接続をバッファプールに入れておきます。データベース接続を確立する必要がある場合は、「バッファプール」から1つを取り出して、使用後に元に戻すだけです。
データベース接続プールは、データベース接続の割り当て、管理、および解放を担当します。これにより、アプリケーションは既存のデータベース接続を再確立する代わりに使用できます。
JDBCデータベース接続プールは、単なるインターフェイスであるDataSourceで表されます。このインターフェースは通常サーバーによって実装され、一部のオープンソース組織が実装を提供します。
データベース接続プールの利点
DBCP C3P0 Druidは、主要な3つのデータベース接続プールテクノロジーです。
c3p0
package com.atguigu4.connection;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
import org.junit.Test;
import java.sql.Connection;
public class C3P0Test {
@Test
public void testGetConnection() throws Exception{
//获取c3p0数据库连接池
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
cpds.setUser("root");
cpds.setPassword("924930871111");
//设置初始时数据库连接池中的连接数
cpds.setInitialPoolSize(10);
Connection connection = cpds.getConnection();
System.out.println(connection);
//销毁c3p0连接池
DataSources.destroy(cpds);
}
}
構成ファイル
<!-- 配置c3p0的基本信息 -->
<named-config name="helloc3p0">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<!--当数据库连接池中的连接数不够时,c3p0一次性向数据库服务器申请的连接数-->
<property name="acquireIncrement">3</property>
<!--c3p0初始化时的连接数-->
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
<!--连接池最多维护的Statement个数-->
<property name="maxStatements">50</property>
<!--每个连接中最多可以使用的Statement的个数-->
<property name="maxStatementsPerConnection">2</property>
</named-config>