JDBC 数据库连接池
http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html
JDBC 数据库连接池 小结
当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用完之后关闭。但是,对于一个复杂的数据库应用,频繁的建立、关闭连接,会极大的减低系统性能,造成瓶颈。所以可以使用数据库连接池来达到连接资源的共享,使得对于数据库的连接可以使高效、安全的复用。
1.通过一个小测试来了解数据库连接池的原理
(1)创建一个属性文件 dbpool.properties
1 driverClassName=com.mysql.jdbc.Driver
2 username=root
3 password=iloveyou
4 url=jdbc:mysql://localhost:3306/student
5 poolSize=5
(2)创建实现数据库连接池的类文件 ConnectionPool.java

1 package dbpool;
2
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.IOException;
6 import java.sql.Connection;
7 import java.sql.SQLException;
8 import java.util.Properties;
9 import java.util.Vector;
10
11 public class ConnectionPool {
12 private Vector<Connection> pool;
13 private String url;
14 private String username;
15 private String password;
16 private String driverClassName;
17 private int poolSize = 1;
18 private static ConnectionPool instance = null;
19
20 //私有构造方法,禁止外部创建本类的对象,要想获得本类的对象,通过<code>getInstance</code>方法
21 private ConnectionPool(){
22 System.out.println("构造函数");
23 init();
24 }
25
26 //连接池初始化方法,读取属性文件的内容,建立连接池中的初始连接
27 private void init(){
28 readConfig();
29 pool = new Vector<Connection>(poolSize);
30 addConnection();
31 }
32
33 //返回连接到连接池中
34 public synchronized void release(Connection coon){
35 pool.add(coon);
36 }
37
38 //关闭连接池中的所有数据库连接
39 public synchronized void closePool(){
40 for (int i = 0; i < pool.size(); i++) {
41 try {
42 ((Connection)pool.get(i)).close();
43 } catch (SQLException e) {
44 // TODO Auto-generated catch block
45 e.printStackTrace();
46 }
47 pool.remove(i);
48 }
49 }
50
51 //返回当前连接池的一个对象
52 public static ConnectionPool getInstance(){
53 if (instance == null) {
54 instance = new ConnectionPool();
55 }
56 return instance;
57 }
58
59 //返回连接池中的一个数据库连接
60 public synchronized Connection getConnection(){
61 if (pool.size() > 0) {
62 Connection conn = pool.get(0);
63 pool.remove(conn);
64 return conn;
65 }else {
66 return null;
67 }
68 }
69
70 //在连接池中创建初始设置的数据库连接
71 private void addConnection(){
72 Connection coon = null;
73 for (int i = 0; i < poolSize; i++) {
74 try {
75 Class.forName(driverClassName);
76 coon = java.sql.DriverManager.getConnection(url, username, password);
77 pool.add(coon);
78 } catch (ClassNotFoundException e) {
79 // TODO Auto-generated catch block
80 e.printStackTrace();
81 } catch (SQLException e) {
82 // TODO Auto-generated catch block
83 e.printStackTrace();
84 }
85 }
86 }
87
88 //读取设置连接池的属性文件
89 private void readConfig(){
90 try {
91 String path = System.getProperty("user.dir") + "\\dbpool.properties";
92 FileInputStream is = new FileInputStream(path);
93 Properties props = new Properties();
94 props.load(is);
95 this.driverClassName = props.getProperty("driverClassName");
96 this.username = props.getProperty("username");
97 this.password = props.getProperty("password");
98 this.url = props.getProperty("url");
99 this.poolSize = Integer.parseInt(props.getProperty("poolSize"));
100 } catch (FileNotFoundException e) {
101 // TODO Auto-generated catch block
102 e.printStackTrace();
103 System.err.println("属性文件找不到");
104 } catch (IOException e) {
105 // TODO Auto-generated catch block
106 e.printStackTrace();
107 System.err.println("读取属性文件出错");
108 }
109 }
110
111 }

(3)创建一个使用连接池访问数据库的类文件 ConnectionPoolTest.java

1 package dbpool;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7
8 public class ConnectionPoolTest {
9 public static void main(String[] args) throws SQLException{
10 String sql = "select * from user";
11 ConnectionPool pool = null;
12
13 for (int i = 0; i < 2; i++) {
14 pool = ConnectionPool.getInstance();
15 Connection conn = pool.getConnection();
16 PreparedStatement stmt = conn.prepareStatement(sql);
17 ResultSet rs = stmt.executeQuery(sql);
18 while (rs.next()) {
19 System.out.println(rs.getString(1) + "\t\t" + rs.getString(2) + "\t\t" + rs.getString(3));
20 }
21 rs.close();
22 stmt.close();
23 pool.release(conn);
24 }
25 pool.closePool();
26 }
27 }

2.在开发具体项目时没有必要自己编写数据库连接池,现在已经有很多现成的组件。许多服务器已经内置了数据库连接池,如Tomcat服务器、Jboss服务器和WebLogic服务器等。我自己根据书上的例子,配置了一下Tomcat服务器。配置步骤如下:
(1)配置Tomcat根目录下的 \conf 中的文件 context.xml 如下:

1 <!--Resource 设置数据库连接池的核心-->
2 <!--属性 name 数据源的名字 属性 auth 表示验证方式 type 资源的类型 -->
3 <Resource name="jdbc/DBWater" auth="Container" Type="javax.sql.DataSource"
4 maxActive="100" maxIdle="30" maxWait="10000"
5 username="root" password="*******"
6 driverClassName="com.mysql.jdbc.Driver"
7 url="jdbc:mysql://localhost:3306/student"/>

将这段代码添加到<context></context>之间
(2)修改项目工程目录下 WebRoot/WEB-INF/web.xml 文件:

1 <resource-ref>
2 <!-- 描述信息 -->
3 <description>Connection Pool</description>
4 <!-- 数据源名字 和上面配置中数据源的名字一致-->
5 <res-ref-name>jdbc/DBWater</res-ref-name>
6 <!-- 数据源类型 -->
7 <res-type>javax.sql.DataSource</res-type>
8 <res-auth>Container</res-auth>
9 <res-sharing-scope>Shareable</res-sharing-scope>
10 </resource-ref>

下面就可以进行连接池使用了。比如,这里,创建一个DBWater.java文件:

1 package com.lihui.dbwater;
2
3 import java.sql.Connection;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6
7 import javax.naming.Context;
8 import javax.naming.InitialContext;
9 import javax.naming.NamingException;
10 import javax.sql.DataSource;
11
12 public class DBWater {
13 String userId;
14 String name;
15 String password;
16
17 public String getUserId(){
18 return userId;
19 }
20
21 public String getName(){
22 return name;
23 }
24
25 public String getpassword(){
26 return password;
27 }
28
29 public void init(){
30 try {
31 InitialContext initC = new InitialContext();//创建InitialContext对象
32 if (initC == null) {
33 throw new Exception("No Context");
34 }
35 Context context = (Context)initC.lookup("java:comp/env");//不变
36 DataSource ds = (DataSource)context.lookup("jdbc/DBWater");//tomcat服务器配置文件中数据源名称
37 if (ds != null) {
38 Connection conn = ds.getConnection();
39 if (conn != null) {
40 Statement statement = conn.createStatement();
41 ResultSet resultSet = statement.executeQuery("select * from user");
42 while (resultSet.next()) {
43 userId = resultSet.getString(1);
44 name = resultSet.getString(2);
45 password = resultSet.getString(3);
46 }
47 conn.close();
48 }
49 }
50 } catch (NamingException e) {
51 // TODO Auto-generated catch block
52 e.printStackTrace();
53 } catch (Exception e) {
54 // TODO Auto-generated catch block
55 e.printStackTrace();
56 }
57 }
58 }

那么在jsp文件中调用该类:

1 <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
2 <%@page import="com.lihui.dbwater.DBWater"%>
3
4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5 <html>
6 <head>
7 <title>连接池测试</title>
8 </head>
9
10 <body>
11 <%
12 DBWater rs = new DBWater();
13 rs.init();
14 %>
15 id:<%=rs.getUserId() %>
16 name:<%=rs.getName() %>
17 psd:<%=rs.getpassword() %>
18 </body>
19 </html>

JDBC 数据库连接池 小结
当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用完之后关闭。但是,对于一个复杂的数据库应用,频繁的建立、关闭连接,会极大的减低系统性能,造成瓶颈。所以可以使用数据库连接池来达到连接资源的共享,使得对于数据库的连接可以使高效、安全的复用。
1.通过一个小测试来了解数据库连接池的原理
(1)创建一个属性文件 dbpool.properties
1 driverClassName=com.mysql.jdbc.Driver
2 username=root
3 password=iloveyou
4 url=jdbc:mysql://localhost:3306/student
5 poolSize=5
(2)创建实现数据库连接池的类文件 ConnectionPool.java

1 package dbpool;
2
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.IOException;
6 import java.sql.Connection;
7 import java.sql.SQLException;
8 import java.util.Properties;
9 import java.util.Vector;
10
11 public class ConnectionPool {
12 private Vector<Connection> pool;
13 private String url;
14 private String username;
15 private String password;
16 private String driverClassName;
17 private int poolSize = 1;
18 private static ConnectionPool instance = null;
19
20 //私有构造方法,禁止外部创建本类的对象,要想获得本类的对象,通过<code>getInstance</code>方法
21 private ConnectionPool(){
22 System.out.println("构造函数");
23 init();
24 }
25
26 //连接池初始化方法,读取属性文件的内容,建立连接池中的初始连接
27 private void init(){
28 readConfig();
29 pool = new Vector<Connection>(poolSize);
30 addConnection();
31 }
32
33 //返回连接到连接池中
34 public synchronized void release(Connection coon){
35 pool.add(coon);
36 }
37
38 //关闭连接池中的所有数据库连接
39 public synchronized void closePool(){
40 for (int i = 0; i < pool.size(); i++) {
41 try {
42 ((Connection)pool.get(i)).close();
43 } catch (SQLException e) {
44 // TODO Auto-generated catch block
45 e.printStackTrace();
46 }
47 pool.remove(i);
48 }
49 }
50
51 //返回当前连接池的一个对象
52 public static ConnectionPool getInstance(){
53 if (instance == null) {
54 instance = new ConnectionPool();
55 }
56 return instance;
57 }
58
59 //返回连接池中的一个数据库连接
60 public synchronized Connection getConnection(){
61 if (pool.size() > 0) {
62 Connection conn = pool.get(0);
63 pool.remove(conn);
64 return conn;
65 }else {
66 return null;
67 }
68 }
69
70 //在连接池中创建初始设置的数据库连接
71 private void addConnection(){
72 Connection coon = null;
73 for (int i = 0; i < poolSize; i++) {
74 try {
75 Class.forName(driverClassName);
76 coon = java.sql.DriverManager.getConnection(url, username, password);
77 pool.add(coon);
78 } catch (ClassNotFoundException e) {
79 // TODO Auto-generated catch block
80 e.printStackTrace();
81 } catch (SQLException e) {
82 // TODO Auto-generated catch block
83 e.printStackTrace();
84 }
85 }
86 }
87
88 //读取设置连接池的属性文件
89 private void readConfig(){
90 try {
91 String path = System.getProperty("user.dir") + "\\dbpool.properties";
92 FileInputStream is = new FileInputStream(path);
93 Properties props = new Properties();
94 props.load(is);
95 this.driverClassName = props.getProperty("driverClassName");
96 this.username = props.getProperty("username");
97 this.password = props.getProperty("password");
98 this.url = props.getProperty("url");
99 this.poolSize = Integer.parseInt(props.getProperty("poolSize"));
100 } catch (FileNotFoundException e) {
101 // TODO Auto-generated catch block
102 e.printStackTrace();
103 System.err.println("属性文件找不到");
104 } catch (IOException e) {
105 // TODO Auto-generated catch block
106 e.printStackTrace();
107 System.err.println("读取属性文件出错");
108 }
109 }
110
111 }

(3)创建一个使用连接池访问数据库的类文件 ConnectionPoolTest.java

1 package dbpool;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7
8 public class ConnectionPoolTest {
9 public static void main(String[] args) throws SQLException{
10 String sql = "select * from user";
11 ConnectionPool pool = null;
12
13 for (int i = 0; i < 2; i++) {
14 pool = ConnectionPool.getInstance();
15 Connection conn = pool.getConnection();
16 PreparedStatement stmt = conn.prepareStatement(sql);
17 ResultSet rs = stmt.executeQuery(sql);
18 while (rs.next()) {
19 System.out.println(rs.getString(1) + "\t\t" + rs.getString(2) + "\t\t" + rs.getString(3));
20 }
21 rs.close();
22 stmt.close();
23 pool.release(conn);
24 }
25 pool.closePool();
26 }
27 }

2.在开发具体项目时没有必要自己编写数据库连接池,现在已经有很多现成的组件。许多服务器已经内置了数据库连接池,如Tomcat服务器、Jboss服务器和WebLogic服务器等。我自己根据书上的例子,配置了一下Tomcat服务器。配置步骤如下:
(1)配置Tomcat根目录下的 \conf 中的文件 context.xml 如下:

1 <!--Resource 设置数据库连接池的核心-->
2 <!--属性 name 数据源的名字 属性 auth 表示验证方式 type 资源的类型 -->
3 <Resource name="jdbc/DBWater" auth="Container" Type="javax.sql.DataSource"
4 maxActive="100" maxIdle="30" maxWait="10000"
5 username="root" password="*******"
6 driverClassName="com.mysql.jdbc.Driver"
7 url="jdbc:mysql://localhost:3306/student"/>

将这段代码添加到<context></context>之间
(2)修改项目工程目录下 WebRoot/WEB-INF/web.xml 文件:

1 <resource-ref>
2 <!-- 描述信息 -->
3 <description>Connection Pool</description>
4 <!-- 数据源名字 和上面配置中数据源的名字一致-->
5 <res-ref-name>jdbc/DBWater</res-ref-name>
6 <!-- 数据源类型 -->
7 <res-type>javax.sql.DataSource</res-type>
8 <res-auth>Container</res-auth>
9 <res-sharing-scope>Shareable</res-sharing-scope>
10 </resource-ref>

下面就可以进行连接池使用了。比如,这里,创建一个DBWater.java文件:

1 package com.lihui.dbwater;
2
3 import java.sql.Connection;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6
7 import javax.naming.Context;
8 import javax.naming.InitialContext;
9 import javax.naming.NamingException;
10 import javax.sql.DataSource;
11
12 public class DBWater {
13 String userId;
14 String name;
15 String password;
16
17 public String getUserId(){
18 return userId;
19 }
20
21 public String getName(){
22 return name;
23 }
24
25 public String getpassword(){
26 return password;
27 }
28
29 public void init(){
30 try {
31 InitialContext initC = new InitialContext();//创建InitialContext对象
32 if (initC == null) {
33 throw new Exception("No Context");
34 }
35 Context context = (Context)initC.lookup("java:comp/env");//不变
36 DataSource ds = (DataSource)context.lookup("jdbc/DBWater");//tomcat服务器配置文件中数据源名称
37 if (ds != null) {
38 Connection conn = ds.getConnection();
39 if (conn != null) {
40 Statement statement = conn.createStatement();
41 ResultSet resultSet = statement.executeQuery("select * from user");
42 while (resultSet.next()) {
43 userId = resultSet.getString(1);
44 name = resultSet.getString(2);
45 password = resultSet.getString(3);
46 }
47 conn.close();
48 }
49 }
50 } catch (NamingException e) {
51 // TODO Auto-generated catch block
52 e.printStackTrace();
53 } catch (Exception e) {
54 // TODO Auto-generated catch block
55 e.printStackTrace();
56 }
57 }
58 }

那么在jsp文件中调用该类:

1 <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
2 <%@page import="com.lihui.dbwater.DBWater"%>
3
4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5 <html>
6 <head>
7 <title>连接池测试</title>
8 </head>
9
10 <body>
11 <%
12 DBWater rs = new DBWater();
13 rs.init();
14 %>
15 id:<%=rs.getUserId() %>
16 name:<%=rs.getName() %>
17 psd:<%=rs.getpassword() %>
18 </body>
19 </html>

|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
29 | 30 | 31 | 1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
搜索
我的标签
- I18N(3)
- JSTL(3)
- Struts2(2)
- 格式标签库(2)
- 国际化(1)
- 配置struts2 web.xml 报错(1)
- 输入校验(1)
- 数字日期格式化(1)
- struts2 action 乱码(1)
- Struts2 标签库 UI标签的使用(1)
- 更多
随笔分类
随笔档案
最新评论
- 1. Re:OpenGL 关于全局固定坐标系统与局部移动坐标系统的理解
- 十分感谢!网上好多都讲不清楚,君真乃神人也!
- --吴溢豪
- 2. Re:JSTL 核心标签库 使用
- 学习,加深了解
- --永远改不完的bug
- 3. Re:JSTL 标签库 下载及配置
- 我照着你说的配置了,但运行不起来,这是怎么回事?我用的是tomcat8和jdk1.8,望博主不吝赐教!
- --ljhaaa
- 4. Re:JSTL 核心标签库 使用
- 一直不知道varStatus的作用呢,学习了
- --晨间新闻
- 5. Re:Android 使用JSON格式与服务器交互 中文乱码问题解决
- @一世尘梦引用@SOSOS's BLog如果是JS里面,有些时候还需要二次转码。改为POST不一定能解决,即便是从后台处理。我自己试过在get下就出现乱码,后来一改为post就没问题了....
- --SOSOS's BLog
JDBC 数据库连接池的更多相关文章
- JAVA基础知识之JDBC——JDBC数据库连接池
JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...
- 【Java123】JDBC数据库连接池建立
需求场景:多SQL任务多线程并行执行 解决方案:建立JDBC数据库连接池,将线程与连接一对一绑定 https://www.cnblogs.com/panxuejun/p/5920845.html ht ...
- JDBC数据库连接池
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库 ...
- Java自学-JDBC 数据库连接池
数据库连接池 与线程池类似的,数据库也有一个数据库连接池. 不过他们的实现思路是不一样的. 本章节讲解了自定义数据库连接池类:ConnectionPool,虽然不是很完善和健壮,但是足以帮助大家理解C ...
- JAVA之JDBC数据库连接池总结篇
JDBC数据库连接池 一.JDBC数据库连接池的必要性 二.数据库连接池技术 三.多种开源的数据库连接池 3.1 C3P0数据库连接池 3.2 DBCP数据库连接池 3.3 Druid(德鲁伊)数据库 ...
- JDBC数据库连接池技术
在JDBC中,获得连接或释放资源是非常消耗系统资源的两个过程,为了解决此类性能问题,通常采用连接池技术,来共享连接.这样我们就不需要每次都创建连接.释放连接了,这些操作都交给了连接池. 用池的概念来管 ...
- JDBC 数据库连接池 小结
原文:http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html 当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用 ...
- JDBC数据库连接池原理
JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...
- Java jdbc数据库连接池总结!(转)
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...
随机推荐
- JSON, list, 前台显示
前台 $(function(){ $.getJSON("/portal/visitor/getVisitorCount?rn="+Math.random(),function(js ...
- JSP注释及scriptlet <%局部%><%!全局%><%=输出%>
显示注释: <!--注释内容-->> 隐式注释: 1. // 2./* */ 3. <%-- 注释内容--%> <!-- 这个注释客户端就可以看见 --> & ...
- MyEclipse10.6、Maven、svn集成
这几天整理maven,根据开发部署需要,需要把原先的myeclipse下的普通javaWeb工程用maven管理,弄了2天,主要还是在jar包的引入上,总是少- -! 好了,下面记录一下我的安装过程: ...
- Inno Setup入门(十六)——Inno Setup类参考(2)
分类: Install Setup 2013-02-02 11:28 815人阅读 评论(0) 收藏 举报 这里将接着在前面的基础上介绍如何在自定义页面上添加按钮.按钮属于Tbutton类,该类继承自 ...
- iOS 10推送通知开发
原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...
- sql server中单引号拼接字符串(书写错误会出现错误"浮点值 XXXX 超出了计算机表示范围(8 个字节)。“XX”附近有语法错误。")
" ' "(单引号)的运用:在sql server中,两个" ' "(单引号)在拼接字符串的情况下运用,就是表示拼接上了一个" ' "单引号 ...
- Android OpenGL ES .介绍
引自:http://blog.csdn.net/hgl868/article/details/6971624 1. OpenGL ES 简介 Android 3D引擎采用的是OpenGL ES. ...
- POJ 2318 TOYS 叉积
题目大意:给出一个长方形盒子的左上点,右下点坐标.给出n个隔板的坐标,和m个玩具的坐标,求每个区间内有多少个玩具. 题目思路:利用叉积判断玩具在隔板的左方或右方,并用二分优化查找过程. #includ ...
- IO流---字符流(FileWriter, FileReader ,BufferedWriter,BufferedReader)
IO Input Output IO流用来处理设备之间的数据传输. java对数据的操作是通过流来实现的. 流按流向分:输入流,输出流 是相对内存而言的.把硬盘的数据读取到内存中就是输入 ...
- JAVA-面向对象2--继承
1. 继承的好处: 1.提高代码复用性. 2.让类与类之间产生关系,为面向对象的第三大特征 多态 提供了前提 2.java中支持单继承,不直接支持多继承,但对c++中多继承进行了改良.java通过多实 ...