JavaWeb学习过程 之c3p0的使用

  这几天在学习使用MVC模式来做几个小项目,在学习的过程中,用到了数据库连接池。便特意去学习了一下。

 

一、谈一谈为什么要使用数据库连接池

  在开发基于数据库的web程序时,传统的模式(在servlet,beans 中建立数据库链接,进行sql操作, 断开数据库链接) 存在着一些问题。

  每次连接都需要验证用户,消耗了大量的资源和时间。数据库的连接资源并没有得到很好地重复利用。再如,同时几万人在线频繁的连接数据库,系统资源消耗巨大,内存可能泄漏,服务器也可能会崩溃。

 

二、什么是数据库连接池

  1.基本思想:可以为数据库建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕再放回去,避免了重复连接所消耗的时间与资源。

  

  2.职责:数据库连接池负责分配,管理,和释放数据库链接,它允许应用程序重复使用一个现有的数据库链接,而不是新建立一个。

  

  3.JDBC的数据库链接池使用javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Webblogic,Tomact)提供实现,也有一些开源组织提供实现:DBCP,C3P0。

 

三、使用C3P0 数据库连接池

  C3P0有两种连接方式。

  1.第一种:

    具体步骤:

      1.导入所需jar包

      2.java代码

      

 1 import java.beans.PropertyVetoException;
 2 import java.sql.Connection;
 3 import java.sql.SQLException;
 4 
 5 import com.mchange.v2.c3p0.ComboPooledDataSource;
 6 
 7 
 8 public class JDBCUtils {
 9     private static Connection conn=null;
10     private static ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
11     
12     public static Connection getConnection(){
13         try {
14             comboPooledDataSource.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
15             comboPooledDataSource.setJdbcUrl("jdbc:sqlserver://localhost:1433;databasename=mysql");
16             comboPooledDataSource.setUser("sa");
17             comboPooledDataSource.setPassword("1546873");
18             
19             comboPooledDataSource.setAcquireIncrement(5);// 可以设置连接池的各种属性
20             
21             conn=comboPooledDataSource.getConnection();
22         } catch (PropertyVetoException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         } catch (SQLException e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         }
29         return conn;
30     }
31 
32 }

 

  2.第二种:

    具体步骤:

      1.导入jar包

      2.配置xml文件。 配置文件名必须名为 c3p0-config.xml 并且放在src目录下

      代码如下

 1 <c3p0-config> 
 2     <named-config name="myc3p0"> 
 3         <property name="user">sa</property> 
 4         <property name="password">ztg591379771</property> 
 5         <property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
 6         <property name="jdbcUrl">jdbc:sqlserver://localhost:1433;databasename=mysql</property> 
 7         
 8         <!-- 若数据库中连接数不足时,一次向数据库服务器申请多少个链接 -->
 9         <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
10         <property name="acquireIncrement">5</property> 
11         
12         
13         <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
14         <property name="initialPoolSize">10</property> 
15         
16         
17         <!--连接池中保留的最小连接数。-->
18         <property name="minPoolSize">10</property> 
19         
20         
21         <!--连接池中保留的最大连接数。Default: 15 -->
22         <property name="maxPoolSize">50</property> <!-- intergalactoApp adopts a different approach to configuring statement caching --> 
23         
24         <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
25             属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
26             如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
27         <property name="maxStatements">20</property> 
28         
29         
30         <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
31         <!-- 每个链接可以使用的Statements 对象的个数 -->
32         <property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him --> 
33     
34     </named-config> 
35 </c3p0-config>

      3.编写utils工具类

 1 import java.sql.Connection;
 2 import java.sql.SQLException;
 3 
 4 import com.mchange.v2.c3p0.ComboPooledDataSource;
 5 
 6 public class JdbcUtils {
 7     
 8     /**
 9      * 释放链接
10      * @param connection
11      */
12     public static void releaseConnection(Connection connection){
13         if(connection!=null){
14             try {
15                 connection.close();
16             } catch (SQLException e) {
17                 // TODO Auto-generated catch block
18                 e.printStackTrace();
19             }
20         }
21     }
22     
23     
24     private static ComboPooledDataSource dataSource=null;
25     
26     static{
27         //只被创建一次
28         dataSource=new ComboPooledDataSource("myc3p0");  // myc3p0 一定要与配置文件中的名字一样
29     }
30         
31     /**
32      * 返回数据源的一个Connection 对象
33      * @return
34      * @throws Exception 
35      */
36     public static Connection getConnection() throws Exception{
37         return dataSource.getConnection();
38     }    
39 }

 

 

  以上是我今天学到的关于c3p0的一些知识,今后在学习的过程中慢慢摸索,逐渐补充。

 

 

    

    

 

  

转载于:https://www.cnblogs.com/ztg-learn/p/5887059.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫高级项目管理师培训学校_推荐一条高效的Python爬虫学习路径!

如果你仔细观察&#xff0c;就不难发现&#xff0c;懂爬虫、学习爬虫的人越来越多&#xff0c;一方面&#xff0c;互联网可以获取的数据越来越多&#xff0c;另一方面&#xff0c;像 Python这样的编程语言提供越来越多的优秀工具&#xff0c;让爬虫变得简单、容易上手。对于小白…

redis报错:jedis connection exception unexpected end of stream

一般的话&#xff0c;原因是你在spring中把jedis客户端配置成了单例模式&#xff08;singleton&#xff09;,所以当在极短时间内&#xff0c;有多个请求连续发送过来时&#xff0c;jedis就会报错&#xff0c;说一个连接还没结束。 所以正确的配置是&#xff0c;将jedis配置成原…

Linq(拓展方法+select())

拓展方法&#xff1a; 目的&#xff1a;对于已存在类型的行为进行拓展 注意事项&#xff1a; 1&#xff1a;扩展方法必须是一种特殊的静态方法 2&#xff1a;扩展方法必须是在静态类中 3: 扩展方法的优先级低于同名类的方法 4&#xff1a;扩展方法只在特定的命名空间内有效 5&a…

Spring MVC:The request sent by the client was syntactically incorrect

一般是由于参数类型不正确所致。比如表单如下&#xff1a; <form:form action"" method"post" commandName"shop"><form:hidden path"id"/><form:input type"text" path"shopName" /><inpu…

Android中解析XML

Android中解析XML转载于:https://www.cnblogs.com/zhujiabin/p/5895340.html

手机全部零件名称图片_【直播课】一条记录中显示多张图片

↑点击上方“Access软件网”免费订阅温馨提示这是一节免费课&#xff0c;干货太多&#xff0c;强烈推荐&#xff01;今天(2019年1月10日)晚上8点&#xff0c;准时开讲&#xff0c;欢迎大家前来听课&#xff01;点击文章末尾左下角的原 理本课示例是显示某个零件的图片&#xf…

Spring MVC使用指示符重定向

在JSP中&#xff0c;可以使用response.sendRedirect("");来重定向&#xff0c;但这条语句不会终止函数执行&#xff0c;即执行完这条语句之后&#xff0c;后面的语句还会执行&#xff0c;这就会造成一些问题。 例如有如下显示店铺的控制器&#xff0c;如果用户设置类…

微信小程序会改变大世界吗?

微信小程序来了&#xff0c; 我们期待很久。关于“小程序”的信息还不是很多&#xff0c;但结合官方的表述已经可以看到一些端倪了。微信小程序会改变大世界吗&#xff1f;以下是徐磊的观点 “应用号”怎么变成“小程序”了 官方的表述里&#xff0c;小程序和原有的三种公众号是…

python筛选法求素数讲解_埃氏筛选法求素数 Python

代码如下def _odd_iter(): # 构建奇数序列 从3开始n 1while True:n n 2yield ndef _not_divisible(n):return lambda x: x % n > 0def primes():yield 2it _odd_iter()while True:n next(it) # 返回序列中的数yield nit filter(_not_divisible(n), it) # 埃氏筛选法,产…

JS循环执行函数setInterval

setInterval&#xff0c;每隔一个时间段执行一遍函数。 调用方法&#xff1a; setInterval&#xff08;functionname,time&#xff09;; 注意&#xff1a;functionname不能带括号&#xff0c;如果要传参要使用另外的方法&#xff0c;否则函数只会执行一次。

android学习的一点点网站资料

一些android的网站资料&#xff0c;可供一些基础者学习和了解&#xff0c;对于大神来说可能就比较小儿科了&#xff0c;主要也是给自己在项目中有时候会遇到某个功能做参考。如果哪位读者有其它的学习资料也可留言共享哈&#xff0c;再次先说声谢谢&#xff01; http://www.run…

python中表达式4**0.5的值为_Python内置函数__用来返回序列中的最小元素

【填空题】表达式 int(4**0.5) 的值为【判断题】34j不是合法的Python表达式。【填空题】已知列表对象x [‘11’, ‘2’, ‘3’],则表达式 max(x) 的值为【填空题】表达式 sum(range(10)) 的值为【判断题】Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类…

Spring MVC Ajax返回中文乱码

因为Spring MVC中返回json要使用ResponseBody注解&#xff0c;而在Spring源码中这个注解的默认编码是“iso-8859-1”&#xff0c;所以传中文的话会乱码。解决办法是&#xff0c;直接使用response的writer来返回json数据。 RequestMapping(path"/receive",methodReque…

OC Swift中UITextFiled、UITextView限制输入字数

OC中限制字数的方法 我是用通知实现的&#xff0c;首先添加UITextFiled和UITextView的接收中心 [[NSNotificationCenter defaultCenter] addObserver:self selector:selector(textViewNotifitionAction:) name:UITextViewTextDidChangeNotification object:nil];[[NSNotificati…

snmp获取交换机日志_日志审计系统和数据库审计系统的区别

今天就易混淆的日志审计系统与数据库审计系统进行辨析。从日志审计系统和数据库审计系统的技术特点和原理来切入&#xff0c;来分析日志审计系统与数据库审计系统的异同。01、日志审计系统系统日志系统日志是记录系统中硬件、软件和系统问题的信息&#xff0c;同时还可以监视系…

java web开发基础学习

由于以前很少用java开发&#xff0c;至于连myEclipse都不怎么熟悉。 1、使用myEclipse生成部署网站步骤。 选tomcat后点击右边的Redeploy 这样便在tomcat目录下生成了一个部署网站文件。 2、使用myEclipse调试web步骤 将project下拉中所有项目的server全部remove. 留下需要调试…

装B指南之使用浏览器播放电影

家里断网了&#xff0c;女票说要看电影。电影之前早已下好&#xff0c;奈何播放器不给力&#xff0c;播放不了rmvb格式&#xff0c;怎么办&#xff1f; 办法很简单&#xff0c;使用浏览器来播放&#xff01;现在的浏览器都内置了视频的解码器&#xff0c;直接将视频拖进浏览器…

python 导入包 作用域_Python 包、模块、函数、变量作用域

Python 项目的组织结构- 包-- 模块--- 类---- 函数、变量Python是利用包和模块来组织一个项目的。包&#xff1a; 包的物理表现是一个文件夹&#xff0c;但是一个文件夹却不一定是个包&#xff0c;要想让个文件夹成为一个包&#xff0c;就必须在这个文件夹下增加个特定的文件 _…

getDate()返回日期不一致问题引发的bug

问题描述 最近在webapp的开发中遇到一个Date对象中getDate获取日期的兼容性问题&#xff0c;Date对象的getDate方法返回的日期和传入的日期不一致&#xff0c;例如&#xff1a; 在android 4.3以下版本&#xff0c;getDate返回的日期会有一天的偏差 var d new Date(1987/04/12)…

JVM垃圾回收机制学习

一、可回收对象判定方法 识别方式有两种。一是&#xff0c;引用计数算法&#xff1b;二是&#xff0c;可达性分析。 第一种方法&#xff1a;引用计数算法。当一个对象被引用时&#xff0c;引用计数器加1&#xff0c;当引用失效时&#xff0c;引用计数器减1。当一个对象的引用…