Java データベース接続プールの詳細な説明
データベース接続プールの原理は次のとおりです:
接続プールの基本的な考え方は、ユーザーがアクセスする必要があるときに、データベース接続をメモリ内のオブジェクトとして保存することです。データベースに接続する場合、新しい接続は作成されませんが、確立されたアイドル状態の接続オブジェクトが接続プールから削除されます。使用後、ユーザーは接続を閉じず、次のリクエストに備えて接続を接続プールに戻します。接続の確立と切断は、接続プール自体によって管理されます。同時に、接続のパラメータを設定することで、接続プール内の接続の初期数、接続の上限と下限、各接続の最大使用数、最大アイドル時間などを制御することもできます。プール。独自の管理メカニズムを通じてデータベース接続の数や使用状況などを監視することもできます。
一般的に使用されるデータベース接続プール:
一般的に使用されるデータベース接続プールには、JNDI、C3p0、Apache の Jakarta、DBCPBoneCP が含まれます。その中で、sping フレームワークが依存するサードパーティは c3p0 と dbcp を使用し、bonecp が最も高速であることが知られています。 . データベース接続プール。 JNDI メソッドで作成および実装されたデータソースは、実際に javax.sql.datasource を実装します (他の 3 つのメソッドはどれも実装されていません)
ここでは主に JNDI メソッドの使用方法を紹介します。このメソッドは Web サーバーによって制御されます (たとえば、 : tomcat、weblogic、websphere、tomcat)、java.sql.datasource を実装します。 Web サーバーは、データ ソースの初期化、接続の作成、割り当て、および接続の管理を行います。機能自体はWebサーバーによって実装されるため、特別なjarパッケージをプロジェクトに導入する必要はありませんが、サーバーの特定の構成ファイルに関連する構成を追加する必要があります。次に、Tomcat サーバー (データベースは MySQL) を例として、この方法の使用法を説明します。
データベースの作成と初期化データ:
create table test(id INT PRIMARY KEY,name VARCHAR(10),price FLOAT) INSERT INTO test VALUES(1,'English',22.2); INSERT INTO test VALUES(2,'Math',78.9); INSERT INTO test VALUES(3,'History',77.9);
1. tomcat ディレクトリの lib にデータ ドライバー mysql-connector-java-5.0.3-bin.jar を配置します
2. tomcat の conf 内のコンテキストを変更します。ファイル、リソース構成のサポートの追加
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/ewsdb" username="root" password="admin" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test1" />
27b947aadc5f313f71419b90a0177f39
1) name: リソースの JNDI 名を指定します。
2) auth: リソースを管理するマネージャーを指定します。これには、コンテナーとアプリケーションという 2 つのオプションの値があります。コンテナーは、リソースがコンテナーによって作成および管理されることを意味し、アプリケーションは、リソースが Web アプリケーションによって作成および管理されることを意味します。
3)type: ResourceのJavaクラス名を指定します。
4) ユーザー名: データベースに接続するためのユーザー名を指定します。
5) パスワード: データベースに接続するためのパスワードを指定します。
6) driverClassName: データベースに接続する JDBC ドライバーの Driver 実装クラスの名前を指定します。
7)url: データベースに接続する URL を指定します。127.0.0.1 は接続するデータベース サーバーの IP、3306 はデータベース サーバーのポート、BookDB はデータベース名です。
8)maxActive: データベース接続プール内のアクティブなデータベース接続の最大数を指定します。値は 0 で、制限がないことを意味します。
9)maxIdle: データベース接続プール内のアイドル状態のデータベース接続の最大数を指定します。値は 0 で、制限がないことを意味します。
10)maxWait: データベース接続プール内のデータベース接続がアイドル状態になる最大時間 (ミリ秒) を指定します。この時間を超えると、例外がスローされます。値は -1 で、無制限に待機できることを意味します。
maxActive="100"
は、同時条件下で接続プールから取得できる接続の最大数を示します。データベースが分離されておらず、1 つのアプリケーションによって使用されている場合、maxActive パラメーターを設定すると、アプリケーションが無制限の接続を取得できなくなり、データベースが 1 つのアプリケーションをサポートするためにのみ使用される場合、理論的には maxActive を次の値に設定できます。データベースがサポートできる最大接続数。 maxActive は、接続プールを通じて同時に取得できる接続の最大数を表します。接続の取得と解放は双方向で行われます。アプリケーションが接続プールを同時に要求すると、接続プールはデータベースから接続を取得し、アプリケーションが接続の使用を終了して接続を接続プールに返す必要があります。接続プールも同時に接続を返しますか? データベースはどうですか?答えは明らかにノーです。その場合、接続プールはパフォーマンスが向上しないだけでなく、パフォーマンスも低下します。では、アプリケーションが接続を返した後は、接続プールをどのように処理すればよいでしょうか。
maxIdle="30"
同時実行中に maxActive=100 に達した場合、アプリケーションが接続を閉じるときに、接続プールはデータベースから 100 個の接続を取得する必要があります (maxIdle=30 であるため、すべてではありません)。接続はデータベースに返されます。接続プールには 30 個の接続が残っており、ステータスはアイドル状態になります。
minIdle=”2”
Minimum はデフォルトでは有効になりません。これは、minIdle を持つ接続プール内の接続が少ない場合、システム監視スレッドは通常の状況では開始されないことを意味します。補足スレッド。
質問: maxActive と maxIdle を設定するにはどうすればよいですか?
理論的には、maxActive はアプリケーションの同時実行数の最大値に設定する必要があります。このようにして、最大同時実行数でもアプリケーションは接続プールから接続を取得できますが、正確に接続を取得することが難しいという点が問題です。最大同時実行数を推定し、それを最大同時実行数に設定することで、最適なサービス品質が保証されます。
maxIdle对应的连接,实际上是连接池保持的长连接,这也是连接池发挥优势的部分,理论上讲保持较多的长连接,在应用请求时可以更快的响应,但是过多的连接保持,反而会消耗数据库大量的资源,因此maxIdle也并不是越大越好,同上例我们建议将 maxIdle设置成50-100中靠近50的数字,例如55。这样就能在兼顾最大并发同时,保持较少的数据库连接,而且在绝大多情况,能够为应用程序提供最快的相应速度。
3.打开应用程序的 Web.xml文件,添加以下配置
<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/ewsdb</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
8f448df49ccb78a46df6973096920559属性说明:
1)description:对所引用的资源的说明。
2)res-ref-name:指定所引用资源的JNDI名字,与41a992d172d4058fa1f494159e00332c元素中的name属性对应。
3)res-type:指定所引用资源的类名,与41a992d172d4058fa1f494159e00332c元素中的type属性对应。
4)res-auth:指定管理所引用资源的Manager,与41a992d172d4058fa1f494159e00332c元素中的auth属性对应
4. 编写使用java代码,并放在tomcat环境下使用,如下
创建JSP范例:MyJsp.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ page import="java.io.*" %> <%@ page import="java.util.*" %> <%@ page import="java.sql.*" %> <%@ page import="javax.sql.*" %> <%@ page import="javax.naming.*" %> <html> <head> <title>Tomcat下JNDI数据库连接池</title> </head> <body> <% try{ Connection conn; Statement stmt; ResultSet rs; Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/ewsdb"); conn = ds.getConnection(); stmt = conn.createStatement(); //查询记录 rs = stmt.executeQuery("select ID,NAME,PRICE from test"); //输出查询结果 out.println("<table border=1 width=400>"); while (rs.next()){ String col1 = rs.getString(1); String col2 = rs.getString(2); float col3 = rs.getFloat(3); //打印显示的数据 out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");} out.println("</table>"); //关闭结果集、SQL声明和数据库连接 rs.close(); stmt.close(); conn.close(); }catch(Exception e){ out.println(e.getMessage()); e.printStackTrace(); } %> </body> </html>
在浏览器中输入http://localhost:8080/test/MyJsp.jsp,即可查看结果
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
更多Java 数据库连接池详解及简单实例相关文章请关注PHP中文网!