Maison  >  Article  >  Java  >  Explication détaillée et exemples simples du pool de connexions à la base de données Java

Explication détaillée et exemples simples du pool de connexions à la base de données Java

高洛峰
高洛峰original
2017-01-11 14:27:101683parcourir

Explication détaillée du pool de connexions à la base de données Java

Le principe du pool de connexions à la base de données est :

L'idée de base du pool de connexions est de stocker la connexion à la base de données en tant qu'objet dans la mémoire lors de l'initialisation du système. Lorsque l'utilisateur a besoin d'accéder à la base de données, au lieu d'établir une nouvelle connexion, un objet de connexion inactif établi est retiré du pool de connexions. Après utilisation, l'utilisateur ne ferme pas la connexion, mais remet la connexion dans le pool de connexions pour la prochaine requête. L'établissement et la déconnexion des connexions sont gérés par le pool de connexions lui-même. Dans le même temps, vous pouvez également contrôler le nombre initial de connexions dans le pool de connexions, les limites supérieure et inférieure des connexions, le nombre maximum d'utilisations de chaque connexion, le temps d'inactivité maximum, etc. en définissant les paramètres de la connexion. piscine. Il peut également surveiller le nombre, l'utilisation, etc. des connexions à la base de données via son propre mécanisme de gestion.

Pools de connexions à la base de données couramment utilisés :

Les pools de connexions à la base de données couramment utilisés incluent JNDI, C3p0, Jakarta d'Apache et DBCPBoneCP. Parmi eux, le tiers sur lequel s'appuie le framework sping utilise c3p0 et dbcp ; Bonecp est connu comme le pool de connexions de base de données le plus rapide. La source de données créée dans la méthode JNDI implémente véritablement javax.sql.datasource (les trois autres méthodes ne le sont pas)

Nous présentons maintenant principalement comment utiliser la méthode JNDI. Cette méthode est contrôlée par le serveur Web (comme. : tomcat, weblogic, websphere, tomcat), implémente java.sql.datasource. Le serveur Web est responsable de l'initialisation de la source de données, de la création des connexions, de l'allocation et de la gestion des connexions. Étant donné que la fonction elle-même est implémentée par le serveur Web, il n'est pas nécessaire d'introduire un package jar spécial dans le projet, mais il est nécessaire d'ajouter des configurations pertinentes à certains fichiers de configuration du serveur. Ensuite, prenons le serveur Tomcat (la base de données est MySQL) comme exemple pour décrire l'utilisation de cette méthode.

Données de création et d'initialisation de la base de données :

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. Placez le pilote de données mysql-connector-java-5.0.3-bin.jar dans la lib du répertoire Tomcat

2. Modifiez le fichier context.xml sous la configuration de Tomcat et ajoutez la prise en charge de la configuration des ressources

<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"
/>

dfa263a6f41fc5118042d968b5a24ba8

1) nom : spécifiez le nom JNDI de la Ressource.

2) auth : Spécifie le gestionnaire qui gère la ressource. Il a deux valeurs facultatives : Conteneur et Application. Conteneur signifie que la ressource est créée et gérée par le conteneur, et Application signifie que la ressource est créée et gérée par l'application Web.

3) type : Spécifiez le nom de la classe Java de la ressource.

4) nom d'utilisateur : Spécifiez le nom d'utilisateur pour vous connecter à la base de données.

5) mot de passe : Précisez le mot de passe pour vous connecter à la base de données.

6) driverClassName : Spécifiez le nom de la classe d'implémentation du pilote dans le pilote JDBC qui se connecte à la base de données.

7)url : Spécifiez l'URL pour se connecter à la base de données, 127.0.0.1 est l'IP du serveur de base de données à connecter, 3306 est le port du serveur de base de données et BookDB est le nom de la base de données.

8) maxActive : Spécifie le nombre maximum de connexions à la base de données actives dans le pool de connexions à la base de données. La valeur est 0, ce qui signifie aucune limite.

9)maxIdle : Spécifie le nombre maximum de connexions à la base de données inactives dans le pool de connexions à la base de données. La valeur est 0, ce qui signifie aucune limite.

10)maxWait : Spécifiez la durée maximale (en millisecondes) pendant laquelle la connexion à la base de données dans le pool de connexions à la base de données sera inactive. Si cette durée est dépassée, une exception sera levée. La valeur est -1, ce qui signifie que vous pouvez attendre indéfiniment.

maxActive="100"

indique le nombre maximum de connexions pouvant être obtenues à partir du pool de connexions dans des conditions simultanées. Si la base de données n'est pas séparée et est utilisée par une seule application, la définition du paramètre maxActive peut empêcher une application d'obtenir des connexions illimitées et d'affecter d'autres applications. Si une base de données n'est utilisée que pour prendre en charge une seule application, maxActive peut théoriquement être défini sur une valeur qui. la base de données peut prendre en charge. Le nombre maximum de connexions. maxActive représente simplement le nombre maximum de connexions pouvant être obtenues simultanément via le pool de connexions. L'acquisition et la libération des connexions sont bidirectionnelles. Lorsque l'application demande simultanément le pool de connexions, le pool de connexions doit obtenir la connexion de la base de données. Ensuite, lorsque l'application a fini d'utiliser la connexion et renvoie la connexion au pool de connexions. le pool de connexions renverra-t-il également la connexion en même temps ? Qu'en est-il de la base de données ? Évidemment, la réponse est non. Dans ce cas, le pool de connexions deviendra inutile. Non seulement cela n'améliorera pas les performances, mais cela les réduira. Ainsi, une fois que l'application a rétabli la connexion, comment gérer le pool de connexions ?

maxIdle="30"

Si maxActive=100 est atteint pendant la concurrence, alors le pool de connexions doit obtenir 100 connexions de la base de données pour l'utilisation de l'application, et lorsque l'application ferme la connexion Enfin, puisque maxIdle=30, toutes les connexions ne seront pas renvoyées à la base de données. Il restera 30 connexions dans le pool de connexions et l'état est inactif.

minIdle=”2”

Le minimum ne prend pas effet par défaut. Cela signifie que lorsqu'il y a peu de connexions dans le pool de connexions avec minIdle, le thread de surveillance du système démarrera la fonction supplémentaire. Dans des circonstances normales, nous ne démarrons pas de discussions supplémentaires.

Question : Comment définir maxActive et maxIdle ?

Théoriquement, maxActive devrait être défini sur le nombre maximum de concurrences de l'application. De cette façon, même avec une concurrence maximale, l'application peut toujours obtenir des connexions à partir du pool de connexions, mais la difficulté est que c'est difficile. pour nous d'être précis, estimer le nombre maximum de simultanéités et le fixer au nombre maximum de simultanéités est une garantie de qualité de service optimale.

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中文网!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn