Java 接続プールと DBUtils

目次

1. データベースプーリングとは何ですか

2 番目に、データベース接続プールを使用する理由

3. 市場にあるデータベース接続プール技術

4. Druid 接続プールの使用方法


1. データベースプーリングとは何ですか

接続オブジェクトのバッファー。アプリケーション、割り当て管理、接続解放の操作を担当します。

2 番目に、データベース接続プールを使用する理由

データベース接続プールを使用する代わりに、DriverManager経由で新しい接続を取得するたびに、接続が破棄され、使い果たされると切断されるため、接続の使用率が低すぎて無駄が多すぎます。データベース サーバーにとっては負担が大きすぎます。データベース サーバーと Java プログラムは接続数を制御できないため、データベース サーバーが簡単にクラッシュする可能性があります。

接続を管理できるようにしたいだけです。一定数の接続オブジェクトを収容できる接続プールを作成できます。最初に、ユーザー用にいくつかの接続オブジェクトを作成できます。ユーザーが接続オブジェクトを取得したい場合は、プールから直接取得できます。はい、これにより時間の節約にもなります。ユーザーが使い終わったら元に戻して、他の人が使い続けることができます。接続使用率を向上させることができます。プール内の既存の接続が使い果たされると、接続プールは新しい接続をサーバーに適用し、それらをプールに入れることができます。プール内のコネクションが「最大コネクション数」に達するまでは新規コネクションの申請はできず、コネクションが得られない場合は待つしかありません。

3. 市場にあるデータベース接続プール技術

JDBC のデータベース接続プールは javax.sql.DataSource で表されます。DataSource は単なるインターフェイス (通常はデータ ソースと呼ばれます) です。このインターフェイスは通常、サーバー (Weblogic、WebSphere、Tomcat) によって実装され、一部のオープン ソース組織も実装を提供しています。

  • DBCPは Apache が提供するデータベース接続プールで、c3p0 よりも高速ですが、独自のバグにより Hibernate3 ではサポートされなくなりました。

  • C3P0はオープ​​ンソース団体が提供するデータベース接続プールで、速度は比較的遅いですが、安定性は悪くありません

  • Proxoolは、sourceforge のオープンソースプロジェクトデータベースのコネクションプールで、コネクションプールの状態を監視する機能を持っていますが、安定性は c3p0 に比べて若干悪いです。

  • BoneCPはオープンソース団体が提供するデータベース接続プールで、DBCP や C3P0 よりも高速ですが、 HikariCPに置き換えられました

  • Druid (ドルイド)はAli社が提供するデータベース接続プールで、DBCP、C3P0、Proxoolの利点を組み合わせたデータベース接続プールと言われています。

4. Druid 接続プールの使用方法

  1. druid 接続プール jar パッケージの導入

    例: druid-1.1.10.jar のインポートは、JDBC ドライバー jar パッケージのインポートと同じです。注: JDBC ドライバー jar パッケージもインポートする必要があります

  2. コードの手順:

    • ステップ 1: データベース接続プール オブジェクトを作成する

    • ステップ 2: 接続プールのパラメータを設定する

    • ステップ 3: 使用する接続プールから接続オブジェクトを取得する

  3. コード例:

public class TestPool {
	public static void main(String[] args) throws SQLException {
		//1、创建数据源(数据库连接池)对象
		DruidDataSource ds =new DruidDataSource();
		
		//2、设置参数
		//(1)设置基本参数
		ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/test");
		ds.setUsername("root");
		ds.setPassword("1234");
		
		//(2)设置连接数等参数
		ds.setInitialSize(5);//一开始提前申请好5个连接,不够了,重写申请
		ds.setMaxActive(10);//最多不超过10个,如果10都用完了,还没还回来,就会出现等待
		ds.setMaxWait(1000);//用户最多等1000毫秒,如果1000毫秒还没有人还回来,就异常了
		
		//3、获取连接
		for (int i = 1; i <=15; i++) {
			Connection conn = ds.getConnection();
			System.out.println("第"+i+"个:" + conn);
			
			//如果这里没有关闭,就相当于没有还
//			conn.close();#这里关闭,是还回池中
		}
	}
}

 4. Druid 接続プールのパラメータの説明

構成 デフォルト 説明する
名前 このプロパティを構成する重要な点は、複数のデータ ソースがある場合に、監視中にそれらを名前で区別できることです。構成されていない場合、名前は「DataSource-」 + System.identityHashCode(this) の形式で生成されます。
URL データベースに接続するための URL はデータベースごとに異なります。例: mysql: jdbc:mysql://10.20.153.104:3306/druid2 oracle: jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
ユーザー名 データベースに接続するためのユーザー名
パスワード データベースに接続するためのパスワード。パスワードを構成ファイルに直接書きたくない場合は、ConfigFilter を使用できます。詳細については、こちらを参照してください: ConfigFilter の使用 · alibaba/druid Wiki · GitHub
ドライバークラス名 URLに基​​づく自動識別 この項目は設定するかどうかを選択できます。druid を設定しない場合は、URL に従って jdbType が自動的に識別され、対応する driverClassName が選択されます (推奨設定)
初期サイズ 0 初期化中に確立された物理接続の数。初期化は、init メソッドが明示的に呼び出されたとき、または getConnection が最初に呼び出されたときに発生します。
マックスアクティブ 8 接続プールの最大数
マックスアイドル 8 現在は使用されていないため、設定は効果がありません
最小アイドル 0 接続プールの最小数
maxWait -1 接続を取得するときの最大待機時間 (ミリ秒単位)。maxWait を構成すると、フェア ロックがデフォルトで有効になり、同時実行効率が低下します。必要に応じて、useUnfairLock プロパティを true に構成することで、不公平なロックを使用できます。
プールPreparedStatements 間違い prepareStatement、つまり PSCache をキャッシュするかどうか。PSCache は、Oracle などのカーソルをサポートするデータベースのパフォーマンスを大幅に向上させます。mysql の下で閉じることをお勧めします。
maxOpenPreparedStatements -1 PSCache を有効にするには、0 より大きく設定する必要があります。0 より大きい場合、poolPreparedStatements が自動的にトリガーされ、true に変更されます。Druid では、Oracle で PSCache が大量のメモリを占有するという問題は発生しません。この値をより大きい値 (たとえば、100) に設定できます。
検証クエリ 接続が有効かどうかを確認するために使用される SQL にはクエリ ステートメントが必要です。validationQuery が null の場合、testOnBorrow、testOnReturn、testwhileIdle は機能しません。
テストオンボロー 真実 接続申請時にvalidationQueryを実行して接続が有効かどうかを確認する設定を行うとパフォーマンスが低下します。
テストオンリターン 間違い 接続を返す際に validationQuery を実行して接続が有効かどうかを確認します。この設定を行うとパフォーマンスが低下します。
アイドル中のテスト 間違い true に設定することをお勧めします。これにより、パフォーマンスに影響がなくなり、セキュリティが確保されます。接続申請時に確認し、アイドル時間が timeBetweenEvictionRunsMillis より大きい場合は、validationQuery を実行して接続が有効かどうかを確認します。
時間間の立ち退き実行数ミリス 2 つの意味があります: 1) Destroy スレッドは接続間隔を検出します。 2) testwhileIdle の判断基準。詳細については、testwhileIdle 属性の説明を参照してください。
エビクション実行ごとのテスト数 使用されなくなりました。DruidDataSource は 1 つの EvictionRun のみをサポートします
minEvictableIdleTimeMills プール内の接続の最小生存時間をミリ秒単位で構成します。
接続初期化SQL 物理接続の初期化時に実行される SQL
例外ソーター dbType に基づく自動識別 データベースが回復不可能な例外をスローした場合に接続を放棄します。
フィルター 属性タイプは文字列であり、拡張プラグインはエイリアスを通じて構成されます。一般的に使用されるプラグインには次のものがあります: 統計監視用のフィルター: 統計ログ用のフィルター: log4j SQL インジェクションを防止するためのフィルター: Wall
プロキシフィルター タイプはListで、フィルタとproxyFiltersを同時に設定した場合は、置換関係ではなく結合関係となります。

5. DBUtils _

commons-dbutils は、Apache 組織によって提供されるオープン ソースの JDBC ツール クラス ライブラリです。JDBC の単純なカプセル化であり、学習コストが非常に低くなります。dbutils を使用すると、プログラムのパフォーマンスに影響を与えることなく、jdbc コーディングのワークロードを大幅に簡素化できます。 。

このうち、QueryRunner クラスは SQL の実行をカプセル化し、スレッドセーフです。

(1) 追加、削除、変更、確認、バッチ処理ができ、

(2) トランザクション処理はConnectionを共有する必要があることを考慮します。

(3) このクラスで最も重要なことは、SQL クエリを簡素化することであり、ResultSetHandler と組み合わせて使用​​すると、ほとんどのデータベース操作を完了できるため、コーディングの量を大幅に削減できます。

(4) 接続プールから取得した接続を手動で閉じる必要がない場合、ランナーは自動的に接続を閉じ、接続プールに解放します。

コンストラクタ:

空のパラメーターを持つコンストラクター。操作を実行するときは、パラメーター Connection オブジェクトを渡す必要があります。リソースは使用後に手動で解放する必要があります。

パブリック QueryRunner() {}

有参构造器,传入一个数据源,执行操作时,从数据源中获取连接,使用完毕自动释放资源。

public QueryRunner(DataSource ds) {}

增删改查操作:

(1)更新

public int update(Connection conn, String sql, Object... params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

......

(2)插入

public <T> T insert(Connection conn,String sql,ResultSetHandler<T> rsh, Object... params) throws SQLException:只支持INSERT语句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自动生成的键值

....

(3)批处理

public int[] batch(Connection conn,String sql,Object params)throws SQLException: INSERT, UPDATE, or DELETE语句

public <T> T insertBatch(Connection conn,String sql,ResultSetHandler<T> rsh,Object params)throws SQLException:只支持INSERT语句

.....

(4)使用QueryRunner类实现查询

public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
}

执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException

执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。

...

ResultSetHandler接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)该方法的返回值将作为QueryRunner类的query()方法的返回值。

该接口有如下实现类可以使用:

  • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

  • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

  • ScalarHandler:查询单个值对象

  • MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

  • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

  • ColumnListHandler:将结果集中某一列的数据存放到List中。

  • KeyedHandler(name): 結果セット内のデータの各行を Map にカプセル化し、指定されたキーをキーとするマップにこれらのマップを格納します。

  • ArrayHandler: 結果セットのデータの最初の行をオブジェクト配列に変換します。

  • ArrayListHandler: 結果セット内のデータの各行を配列に変換し、List に格納します。

おすすめ

転載: blog.csdn.net/rbx508780/article/details/127288319