2021年3月の接続プール

1.接続プール
質問:接続プールとは何ですか?その用途は何ですか?
接続プール:複数の接続オブジェクトをロードするコンテナを作成します。接続オブジェクトを使用する場合は、コンテナから接続を取得します。使用が完了したら、接続をコンテナにリロードします。このコンテナは接続プール(データソース)であり、データソースとも呼ばれます。

接続プールを介して接続オブジェクトを取得できます。
利点:接続を節約し、接続パフォーマンスの消費を解放します。接続プール内の接続は、多重化の役割を果たし、プログラムのパフォーマンスを向上させます。

、、、、、、、、、、、、、、、、、
カスタム接続プール
1. MyDataSourceクラスを作成し、このクラスにLinkedListを作成します
。2。構築メソッドでListコレクションを初期化し、FiveConnectionにロードします。オブジェクト。
3. public Connection getConnection();を作成します。Listコレクションから接続オブジェクトを取得して戻ります。
4. public void readd(Connection)を作成します。このメソッドは、使用されているConnectionオブジェクトをListコレクションに再ロードします。
コードの問題:
(1)接続プールの作成には標準があります。
インターフェースDataSourceはjavax.sqlパッケージで定義されています。
簡単に言えば、すべての接続プールはjavax.sql.DataSourceインターフェースとカスタム接続プールを実装する必要があります。 DataSource。インターフェースを実装する必要があります。
(2)操作するときは、標準を使用する必要があります。con.close()を破棄せずに、接続プールにリロードするにはどうすればよいですか。
この問題を解決するには、接続のclose()メソッドの動作を変更することが重要です。
メソッドの動作を変更する方法(メソッドの機能を強化する)
1。継承:このクラスの構造を制御できる必要があります
。2。装飾モードでは、テンプレートクラスを使用して、すべてのメソッドの実装を回避できます
(1 )decoratedクラスとdecoratedクラスを実装する必要があります同じインターフェイスまたは同じ親クラスを継承します
(2)装飾クラスで装飾クラス参照を保持します
(3)メソッドの機能を強化します
3.動的プロキシ
動作を拡張できます
Proxy.newProxyInstance(ClassLoader、Class []、InvocationHandler);
結論:Connectionオブジェクトが接続プールから取得された場合、そのcloseメソッドの動作が変更され、破棄されずに接続プールに再ロードされます。 。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
1。接続プールはjavax.sql.DataSourceインターフェースを実装する必要があります
。2。接続オブジェクトを取得する必要があります。接続プールを介してDataSourceインターフェイスにgetConnectionメソッドがあります。3
。接続を接続プールにリロードし、Connectionのclose()メソッドを使用します

2.オープンソース接続プール
1.c3p0(満たす必要があります)
c3p0はオープ​​ンソースのJDBC接続プールであり、データソースとJNDIバインディングを実装し、JDBC3仕様とJDBC2標準拡張をサポートします。
現在それを使用してオープンソースプロジェクト等休止状態、ばねを含む
C3P0とDBCPの違いはある
DBCPが機能していません
自動的にアイドル状態の接続を再利用するが。
C3P0が有する機能自動的に再利用アイドル接続のを。C3P0接続プールの使用:
( 1)
c3p0-0.9.1.2.jarの
使用
1.マニュアル

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(“ com.mysql.jdbc.Driver”);
cpds.setJdbcUrl(“ jdbc:mysql:/// day18”);
cpds.setUser( "root");
cpds.setPassword( "abc");

2.自動(構成ファイルを使用)

c3p0の構成ファイルは、プロパティまたはxmlにすることができます。

c3p0構成ファイルの名前がc3p0.propertiesまたはc3p0-config.xmlであり、それがクラスパスパス(Webアプリケーションのクラスディレクトリ)に配置されている場合
、c3p0は自動的に検索されます。
注:その時点で必要なのは、構成ファイルをsrcの下に配置することだけです。
使用する:

ComboPooledDataSource cpds = new ComboPooledDataSource();
1
指定されたディレクトリで指定された名前の構成ファイルを検索し、その内容をロードします。

2.
dbcp (理解)dbcpは、apacheのオープンソース接続プールです。
DBCP接続プールを使用するには、jarパッケージをダウンロードします
。インポート時に2つの
commons-dbcp-1.4.jarcommons
-pool-1.5.6.jarをインポートします
。dbcp接続プールの使用について
1.手動構成(手動コーディング)

		BasicDataSource bds = new BasicDataSource();
			// 需要设置连接数据库最基本四个条件
			bds.setDriverClassName("com.mysql.jdbc.Driver");
			bds.setUrl("jdbc:mysql:///day18");
			bds.setUsername("root");
			bds.setPassword("abc");
			// 得到一个Connection
			Connection con = bds.getConnection();

2.自動構成(構成ファイルを使用)

プロパティprops = new Properties();
FileInputStream fis = new FileInputStream(“ D:\ java1110 \ workspace \ day18_2 \ src \ dbcp.properties”);
props.load(fis);
DataSource ds = BasicDataSourceFactory.createDataSource(props);

c3p0には通常2つの構成があります。1つはsetメソッドを使用して構成する方法で、もう1つは同じsrcディレクトリにあるc3p0-conflg.xmlファイルまたはc3p0.propertiesファイルを使用して関連する構成を構成する方法です。

c3p0は、setメソッドを使用して構成されます

private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
 * 配置DataSource
 */
public static void configDataSource(){
    try {
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/zhanghanlun");
        dataSource.setUser("zhanghanlun");
        dataSource.setPassword("123456");
        dataSource.setInitialPoolSize(3);
        dataSource.setMaxPoolSize(10);
        dataSource.setMinPoolSize(3);
        dataSource.setAcquireIncrement(3);
    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
}
/**
 * 获取Connection连接
 * @return
 */
public static Connection getConnection(){
    Connection conn = null;
    configDataSource();
    try {
        conn = dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}

c3p0は、c3p0-config.xmlファイル
を介して構成されます構成ファイルを介した構成については、

ここでは、xmlファイルメソッドをsrcフォルダーに配置する必要があり、c3p0は関連する構成についてファイルをスキャンします。
c3p0およびmysql-connector-javaの依存関係をMavenの依存関係に追加するには、バージョン番号を書き込む必要があります。
あまりナンセンスではありません。これがc3p0-config.xmlファイルのコードです。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <property name="user">zhanghanlun</property>
        <property name="password">123456</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">3</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">2</property>
        <property name="maxStatements">200</property>
    </default-config>
    <!-- 命名的配置,可以通过方法调用实现 -->
    <named-config name="test">
        <property name="user">zhanghanlun</property>
        <property name="password">123456</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <!-- 如果池中数据连接不够时一次增长多少个 -->
        <property name="acquireIncrement">5</property>
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">20</property>
        <!-- 数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">25</property>
        <!-- 数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">5</property>
    </named-config>
</c3p0-config>

Javaコードは以下に対応します

    //加载名字为“test”的配置文件
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("test");
    /**
     * 获取Connection连接
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

コードははるかに簡潔なので、通常は構成ファイルを使用してデータベース接続プールを作成します。


c3p0の一般的な構成パラメーターの概要c3p0の以前の関連構成では、c3p0の構成パラメーターを確認しました。ここでは、c3p0のいくつかの一般的な構成パラメーターを紹介します。

最も基本的なパラメーター構成
driverClass:データベースドライバー(mysqlやoracleデータベースドライバーなど)
jdbcUrl:jdbcデータベース接続アドレス(jdbc:mysql:// localhost:3306 / zhanghanlunなど)
ユーザー:データベースユーザー名
パスワード:およびデータベースユーザー名前に対応するデータベースパスワード

基本的なパラメータ設定
パラメータデフォルト値説明
initialPoolSize3接続プールが初期化されるときに作成される接続の数(maxPoolSizeとminPoolSizeの間)
maxPoolSize 15接続プール内の最大接続数(新しい接続が取得された場合)、接続の総数この値を超えます新しい接続を取得しませんが、他の接続が解放されるのを待つため、この値は大きくなるように設計できます
。minPoolSize3接続プールによって維持される接続の最小数。次のmaxIdleTimeExcessConnectionsは組み合わせて使用​​されます。これにより、接続プールの負荷が軽減されます
。acquireIncrement3アイドル状態の接続が利用できないときに、接続プールによって一度に作成される新しいデータベース接続の数

管理プールのサイズと接続時間の構成
パラメーターのデフォルト値説明
maxIdleTime0接続の最大アイドル時間。この時間を超えると、データベース接続は使用されていないため、切断されます。0の場合、切断されることはありません。 Open Connection
maxConnectorAge 0接続の最大絶対
経過時間(単位は秒)、0は絶対経過時間が無限であることを意味しますmaxIdleTimeExcessConnection 0接続プールの負荷を軽減するために、接続プールがピークを通過するときの単位は秒ですデータアクセスの場合、多くの接続が作成されますが、接続プールは後でそれを必要としません。非常に多くの接続を維持するには、maxIdleTime未満である必要があります。構成が0でない場合、接続プールの数はminPoolSizeに保持されます。

接続テストの構成
パラメーターのデフォルト値説明
automaticTestTablenull nullでない場合、c3p0は指定された名前の空のテーブルを生成し、このテーブルを使用して接続をテストします
connectionTesterClassNamecom.mchange.v2.c3p0.impl.DefaultConnectionTester-実装することによりConnectionTesterまたはQueryConnectionTesterクラス接続をテストします。クラス名はフルパスを確立する必要があります。
idleConnectionTestPeriod0数秒ごとにすべての接続プールのアイドル接続をチェックします。preferredTestQuerynull
すべての接続テストに対して実行されるテストステートメントを定義します。接続テストを使用する場合、これによりテスト速度が大幅に向上します。注:テストテーブルは、初期データソースの時点で存在している必要があります
。testConnectionOnCheckinfalsetrueに設定すると、接続の取得時に接続の有効性が検証されます
。testConnectionOnCheckoutfalse trueの場合、同僚は、接続が解放されたときの接続セックス。
これらのパラメーターの中で、idleConnectionTestPeriod、testConnectionOnCheckout、およびtestConnectuonOnCheckinは、接続がチェックされるタイミングを制御します。AutomaticTestTable、connectionTesterClassName、およびperferedTestQueryは、接続の検出方法を制御します。

ステートメントプールの構成
パラメータデフォルト値説明
maxStatements0データソースにロードされるPreparedStatementsの数を制御するために使用されるJDBC標準パラメータ
maxStatementsPerConnection0 maxStatementsPerConnectionは、接続プール内の単一の接続が所有するキャッシュステートメントの最大数を定義します
statementCacheNumDeferredCloseThreads0ゼロより大きい場合、ステートメントプールは、親接続がクライアントによって使用されなくなるか、プール自体によって内部的に(たとえば、テストで)使用されるまで、物理的なclose()キャッシュステートメントを遅延させます。

データベース中断リカバリを設定します。
パラメータのデフォルト値説明
acquireRetryAttempts30データベースから新しい接続を取得した後の繰り返し試行回数を定義します
。acquireRetryDelay1000。2つの接続間の間隔(ミリ秒単位)。breakAfterAcquireFailurefalse
。接続の取得に失敗すると、すべての待機が発生します。接続プールが接続を取得するため。スレッドは例外をスローします。ただし、データソースは引き続き効果的に保持され、次にgetConnection()が呼び出されたときに、接続の取得を試行し続けます。trueに設定すると、接続の取得に失敗した後、データソースは切断されたと宣言され、完全に閉じられます。

未解決のトランザクションを構成し
ますパラメーターのデフォルト値の説明
autoCommitOnClosefalse接続が閉じられると、コミットされていないすべての操作がデフォルトでロールバックされます。trueの場合、uncommittedはロールバックではなくコミットされるように設定されます。
forceIgnoreUnresolvedTransactions false公式文書では、これをtrueに設定しないでください。

その他のデータソース構成
パラメーターデフォルト値説明
checkoutTimeout0接続プールが使い果たされると、クライアントはgetConnection()を呼び出し、新しい接続を取得するまで待機します。タイムアウト後、SQLExceptionがスローされます。0に設定されている場合、無期限に待機します。単位はミリ秒です。
factoryClassLocation 0は、c3p0ライブラリのパスを指定します(通常はこれが当てはまります)。ローカルで取得できるため、設定する必要はありません。デフォルトはnullです
。numHelperThreads3c3p0は非同期操作であり、JDBC操作が遅くなります。ヘルパープロセスを通じて行われます。これらの操作を拡張すると、パフォーマンスを効果的に向上させることができます。マルチスレッドを使用すると、複数の操作を同時に実行できます。

DBUtils
DBUtilsはJDBC開発ステップを簡素化するため、データベースに接続する機能を実現するために使用するコードの量を減らすことができます。DBUtilsダウンロードアドレス

JavaBeanコンポーネント
JavaBeanは、データをカプセル化するために使用されるクラスです。データベースとの接続において、JavaBeanの機能は、取得したデータベースレコードをJavaBeanにカプセル化することです。機能は次のとおりです。

  1. インターフェイスを実装する必要があります:java.io.Serializable、省略できます。
  2. プライベートフィールドを提供します:プライベートタイプのフィールド名。
  3. ゲッター/セッターメソッドを提供します。
  4. パラメータなしの構造を提供します

DBUtilsは
DBUtilsを使用してJDBC操作をカプセル化します。コア機能は次のとおりです。


Dbutilsの3つのコア関数の概要5.QueryRunnerはSQLステートメント操作用のAPIを提供します。6。ResultSetHandler
インターフェイスは、選択操作後に結果セットをカプセル化する方法を定義するために使用されます
。7。DbUtilsクラスは、終了を定義するツールクラスです。リソースとトランザクション処理方法

QueryRunnerコアクラス:
8。QueryRunner(DataSource ds);着信パラメーターは接続プールです。9。update(
String sql、Object ... params)、挿入更新削除操作を実行します。10。query
(String sql、ResultSetHandler rsh、Object。 .. params)、選択操作を実行します
11.バッチ、バッチ処理

// ArrayHandler处理类的使用,一条记录封装到数组object
	public static void queryDemo01() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		Object[] objs = qr.query("select * from category where cid = ?", new ArrayHandler(), 1);
		for(Object o: objs){		// object[]中保存了object对象
			System.out.println(o);
		}
	}
	
	// ArrayListHandler,多条记录封装到装有object数组的list集合
	public static void queryDemo02() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		List<Object[]> objs = qr.query("select * from category ", new ArrayListHandler());
		for (Object[] objects : objs) {
			System.out.println(objects[0]+"\t"+objects[1]);
		}
	}
	
	// BeanHandler处理类的使用,封装到JavaBean类
JavaBean
JavaBean就是一个类,在开发中常用语封装数据。具有如下特性
1.需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
2.提供私有字段:private 类型 字段名;
3.提供getter/setter方法:
4. 提供无参构造

	public static void queryDemo03() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		Category c = qr.query(sql, new BeanHandler<Category>(Category.class));
		System.out.println(c);
	}
	
	// BeanListHandler
	public static void queryDemo04() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		List<Category> c = qr.query(sql, new BeanListHandler<Category>(Category.class));
		for (Category category : c) {
			System.out.println(category);
		}
	}
	
	// ColumnListHandler处理类的使用
	public static void queryDemo05() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		List<Object> c = qr.query(sql, new ColumnListHandler<Object>("cname"));
		System.out.println(c);
	}
	
	ScalarHandler: 将单个值封装、 例如select count(*),求内容的条数;
	KeyedHandler:将多条记录封装到一个Map集合的Map集合中。并且外面的Map集合是可以指定的
	
	// MapHandler处理类的使用
	public static void queryDemo06() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		Map<String, Object> map = qr.query(sql, new MapHandler());
		// 3.
		System.out.println(map);
	}
	
	// MapListHandler处理类的使用
	public static void queryDemo07() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		List<Map<String, Object>> maps = qr.query(sql, new MapListHandler());
		// 3.List
		System.out.println(maps);
	}
	
	// MapListHandler处理类的使用
	public static void queryDemo08() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select count(*) from category";
		Long count = qr.query(sql, new ScalarHandler<Long>());
		// 3.List
		System.out.println(count);
	}
}

おすすめ

転載: blog.csdn.net/weixin_44177643/article/details/114945177