这几天在学习使用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的一些知识,今后在学习的过程中慢慢摸索,逐渐补充。