Java 数据库连接池详解及简单实例
java 数据库连接池详解
数据库连接池的原理是:
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
常用的数据库连接池:
常用的数据库连接池有jndi,c3p0,apache 的jakarta 和dbcpbonecp其中,sping框架依赖的第三方使用了c3p0和dbcp两种方式;而bonecp号称是速度最快的数据库连接池。jndi方式创建实现的datasource是真正实现了javax.sql.datasource(其他的三种方式都不是)
现在我们主要来介绍如何使用jndi方式, 这种方式,是由web服务器(例如:tomcat,weblogic,websphere,tomcat),实现了java.sql.datasource。由web服务器负责初始化数据源,创建connection,分配,管理connection。由于本身是由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.将 数据驱动mysql-connector-java-5.0.3-bin.jar 放入tomcat目录下的lib中
2.修改tomcat的conf下的context.xml文件,增加resource的配置的支持
<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" />
<resource属性说明>
1)name:指定resource的jndi名字。
2)auth:指定管理resource的manager,它有两个可选值:container和application。container表示由容器来创建和管理resource,application表示由web应用来创建和管理resource。
3)type: 指定resource的java类名。
4)username:指定连接数据库的用户名。
5)password:指定连接数据库的口令。
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"
表示并发情况下最大可从连接池中获取的连接数。如果数据库不是单独,供一个应用使用,通过设置maxactive参数可以避免某个应用无限制的获取连接对其他应用造成影响,如果一个数据库只是用来支持一个应用那么maxactive理论上可以设置成该数据库可以支撑的最大连接数。maxactive只是表示通过连接池可以并发的获取的最大连接数。连接的获取与释放是双向,当应用程序并发请求连接池时,连接池就需要从数据库获取连接,那么但应用程序使用完连接并将连接归还给连接池时,连接池是否也同时将连接归还给数据库呢?很显然答案是否定的,如果那样的话连接池就变得多此一举,不但不能提高性能,反而会降低性能,那么但应用成归还连接后,连接池如何处理呢?
maxidle="30"
如果在并发时达到了maxactive=100,那么连接池就必须从数据库中获取100个连接来供应用程序使用,当应用程序关闭连接后,由于maxidle=30,因此并不是所有的连接都会归还给数据库,将会有30个连接保持在连接池种中,状态为空闲。
minidle=”2”
最小默认情况下并不生效,它的含义是当连接池中的连接少有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>
<resource-ref>属性说明:
1)description:对所引用的资源的说明。
2)res-ref-name:指定所引用资源的jndi名字,与<resource>元素中的name属性对应。
3)res-type:指定所引用资源的类名,与<resource>元素中的type属性对应。
4)res-auth:指定管理所引用资源的manager,与<resource>元素中的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,即可查看结果
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: kubernetes替换pod文件
下一篇: centos安装k8s