一般的なデータベース接続プールをまとめたもの
まず、なぜプールを接続する必要があります
データベース接続は、特にマルチユーザのWebアプリケーションに反映されている制限され、高価なキー資源、です。データベース接続オブジェクトが1つの物理データベース接続に対応し、物理的な接続を開くための各動作は、そのようなシステムのパフォーマンスの低下をもたらす、接続を閉じるまで使用されています。
ソリューションデータベース接続プールは、アプリケーションが十分なデータベース接続を開始し、これらの接続プールを形成するように接続されていると言うときに作成され、接続プールを動的に適用され、使用およびアプリケーションによって解放します。
より多くの同時要求の場合は、接続プールの接続が要求キューにキューイングされなければなりません。プール内の接続のアプリケーションと利用を動的にプール内の接続の数を増減します。
できるだけ多くの接続プールは、リソースのメモリ消費量を再利用するために、メモリおよび改善サーバの効率を大幅に節約は、より多くの顧客サービスをサポートするのに役立ちます。接続プールを使用することにより、プログラムが大幅に同時に運用効率を向上させます、我々は独自の管理メカニズム、使用状況やその他の情報を介してデータベース接続の数を監視することができます。
第二に、定義
データベース接続プールは、アプリケーションではなく1を再作成し、既存のデータベース接続を再利用することを可能にするデータベース接続の配布、管理、およびリリース、担当しています。
第三に、原則
接続プーリングは、主に3つの部品、接続プール、接続プールの管理接続の確立、すなわちで構成されて動作し、接続が閉じられたプールです。
まず、接続プールを確立します。一般に、システムの初期化中に、接続プールは、システム構成に基づいて確立され、接続プールの使用から得るために、プール内の複数の接続オブジェクトを作成しました。接続プールは、このように閉鎖によって引き起こされる任意の接続確立とオーバーヘッドを回避し、作成し、オフに自由にすることはできません。Javaは、多くのコンテナが簡単にこのようなベクターとして接続プールを構築することができます提供し、スタックが好きです。
第二に、接続プール管理。接続プール管理戦略は、システムのパフォーマンスに大きな影響を与える接続プーリング、割り当ておよび接続プールの接続の解放のための中核機構です。経営戦略は次のとおりです。クライアントがデータベース接続を要求すると、空き接続プールがあるかどうかを確認する最初の、接続がアイドル状態である場合には、顧客が接続に割り当てられます。接続がアイドル状態でない場合は、接続の数は、現在すでにオープンしているチェックそれは要求元のクライアントに再作成接続に到達しなかった場合は最大接続数は、;それはあなたが最大待機時間を超えた場合は、待機するように最大待機時間を設定することにより、それに達した場合、例外が顧客にスローされます。
クライアントがデータベース接続を解放すると、最初だけそうでなければ他の顧客のために予約され、接続プールから接続を削除以上の場合引用接続の数が、所定値を超えた決定。
この戦略は、システムリソースのオーバーヘッドに起因する頻繁な確立、接続解除を避けるため、効率的な再利用データベース接続を保証します。
第三に、接続プールを閉じます。アプリケーションの終了時に、接続プール、リソースの解放に関連した接続プール、正反対の作成プロセスのすべてがあります。
第四に、従来のデータベース接続プールのデータベース接続の比較
:ステップデータベース接続プールが使用されていない
接続を確立するためにTCP 3ウェイハンドシェイクを
MySQLの認定スリーウェイハンドシェイク
の実際のSQL実装
MySQLが閉じ
近いTCPハンドシェイクを
SQLを実行するために、あなたが見ることができますが、我々は気にしない多くのより多くのネットワークの相互作用。長所:シンプル
短所:
- ネットワークIOより
- 高負荷データベース
- 低QPSの応答時間
- アプリケーションの作成頻繁に接続して、GC頻繁により一時その結果、接続を閉じます
- 接続が閉じられた後、TCP TIME_WAIT状態の多数が存在することになる(OFF 2 MSL後)
手順データベース接続プールを使用します:
最初の訪問は、我々は、接続を確立する必要があります。訪問した後、しかし、以前に作成した接続、SQL文の直接実行を再利用します。
利点:
少ないネットワークオーバーヘッド
システムのパフォーマンスが大幅なアップグレードが可能になる
トラブルTIME_WAIT状態ませんでした
第五に、共通接続プールのコントラストは、
現在、いくつかのオープンソースのJavaデータベース接続プールがあり、接続プールは、java.sqlの基礎で書かれています。
データベースのテストをビルドし、テーブルを作成します
CREATE TABLE `user` (
`userid` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) DEFAULT NULL,
`password` VARCHAR(255) DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
`phone` VARCHAR(255) DEFAULT NULL,
`status` VARCHAR(255) NOT NULL DEFAULT '0',
`code` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=INNODB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
DBCP接続プール
:オープンソースのApache Software Foundationの下のDBCP接続プールは、DBCPデータソースを使用して実装され、アプリケーションは、次の2つのjarファイルシステムを追加する必要があり
コモンズ-dbcp.jarを:接続プール実装
コモンズ-pool.jarを:実装依存ライブラリ接続プール
Tomcatの接続プールを達成するために、接続プールを使用することです。データベース接続プールは、アプリケーションサーバと統合されたいずれかを使用することができ、アプリケーションは、独立して使用することができます。
コアクラス:. Org.apache.commons.dbcp2 のBasicDataSource実装にDataSourceオブジェクトを拡張
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory;
import org.junit.Test;
import com.alibaba.druid.pool.DruidDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class SqlDriverManage {
private final String driverClassName = "com.mysql.cj.jdbc.Driver";
private final String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC";
private final String userName = "root";
private final String userPassword = "123456";
Connection con=null;
PreparedStatement pst=null;
ResultSet rs=null;
/*
* 使用java.sql.DriverManager类----传统方式,没有使用连接池,需要引入mysql驱动包
*/
@Test
public void test1(){
try {
//1.驱动注册程序
Class.forName(driverClassName);
//2.获取连接对象
con= DriverManager.getConnection(url,userName, userPassword);
//3.准备sql
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//7.关闭连接(顺序:后打开的先关闭)
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
/*
* 第一种方式使用实现了javax.sql.DataSource接口的子类--DBCP连接池硬编码
* 在上述代码中添加单元测试代码
*/
@Test
public void test2(){
try {
//1.驱动注册程序
BasicDataSource bds=new BasicDataSource();
bds.setDriverClassName(driverClassName);
bds.setUrl(url);
bds.setUsername(userName);
bds.setPassword(userPassword);
//2.获取连接对象
con=bds.getConnection();
//3.准备sql语句
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
*第二种方式使用实现了javax.sql.DataSource接口的子类--DBCP连接池软编码
*/
@Test
public void test3(){
try {
//1.驱动注册程序
Properties pro=new Properties();
BasicDataSource bds=null;
InputStream inStream=SqlDriverManage.class.getResourceAsStream("dbcp.properties");
pro.load(inStream);
bds=new BasicDataSourceFactory().createDataSource(pro);
//2.获取连接对象
con=bds.getConnection();
//3.准备sql语句
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
#dbcp.properties
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
このプロセスでは、問題に発生します
ソリューションTomcatのbinディレクトリにtomcatに-juli.jarを追加
ソリューション:
- 同じBasicDataSouceでDBCP接続プールのコンフィグレーションファイルとキー属性
- 真のURL allowPublicKeyRetrieval =を追加した後
C3P0接続プール:
最も一般的な接続プール!Springフレームワーク、デフォルトC3P0接続プールの技術でサポートされています!
私たちは、c3p0-0.9.1.2.jar導入する必要がある
コアクラスを:. Com.mchange.v2.c3p0 ComboPooledDataSourceに実装をPooledDataSourceがDataSourceを拡張します
/*
* 使用实现了javax.sql.DataSource接口的子类--c3p0连接池硬编码
*/
@Test
public void test4(){
try {
//1.驱动注册程序
ComboPooledDataSource cpd=new ComboPooledDataSource();
cpd.setDriverClass(driverClassName);
cpd.setJdbcUrl(url);
cpd.setUser(userName);
cpd.setPassword(userPassword);
//2.获取连接对象
con=cpd.getConnection();
//3.准备sql语句
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 使用实现了javax.sql.DataSource接口的子类--c3p0连接池配置文件xml
*/
@Test
public void test5(){
try {
//1.驱动注册程序
ComboPooledDataSource cpd=new ComboPooledDataSource("mysql-config");
//ComboPooledDataSource cpd=new ComboPooledDataSource();
//2.获取连接对象
con=cpd.getConnection();
//3.准备sql语句
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
<!--自动加载src下c3p0的配置文件【c3p0-config.xml】,必须是放在src下。-->
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123456</property>
</default-config>
<named-config name="mysql-config">
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123456</property>
</named-config>
</c3p0-config>
このプロセスでは、問題に発生します
DRUID
モニタリングと健康データベース接続プールとして知られているドルイドAlibabaの開発。データベース・アクセスのパフォーマンスを監視することができ、ドルイドは、構築されたオンラインアクセス性能解析データベースに便利ですSQL実行のパフォーマンスに関する統計情報を詳細に強力なStatViewプラグインを提供します。
コアクラスcom.alibaba.druid.pool.DruidDataSourceはDruidAbstractDataSourceがDataSourceを実装して拡張します
/*
* 使用实现了javax.sql.DataSource接口的子类--druid连接池硬编码
*/
@Test
public void test6(){
try {
//1.驱动注册程序
DruidDataSource dds=new DruidDataSource();
dds.setDriverClassName(driverClassName);
dds.setUrl(url);
dds.setUsername(userName);
dds.setPassword(userPassword);
//2.获取连接对象
con=dds.getConnection();
//3.准备sql语句
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 使用实现了javax.sql.DataSource接口的子类--druid连接池软编码
*/
@Test
public void test7(){
try {
//1.驱动注册程序
Properties pro=new Properties();
DataSource dds=null;
InputStream inStream=SqlDriverManage.class.getResourceAsStream("druid.properties");
pro.load(inStream);
dds=com.alibaba.druid.pool.DruidDataSourceFactory.createDataSource(pro);
//2.获取连接对象
con=dds.getConnection();
//3.准备sql语句
String sql="select * from user";
//4.创建prepareStatement
pst=con.prepareStatement(sql);
//5.执行sql语句,得到返回结果
rs= pst.executeQuery();
//6.遍历结果,索引从1开始
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
#druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=truecharacterEncoding=UTF-8&useSSL=false&serverTimezone=UTC