CP30连接池连接数据库

本文介绍了C3P0数据库连接池的工作原理和优势,包括如何减少频繁创建和关闭数据库连接的资源浪费。讨论了连接池的最小连接数和最大连接数设置,并分析了其对性能的影响。讲解了C3P0的主要配置参数,如driver、url、username、Password、initialPoolSize、maxPoolSize。同时,提到了实现DataSource接口的重要性以及连接池的常见实现方式。文章还强调了配置文件的位置和命名规范,以及在Java中使用getResourceAsStream方法的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CP30连接池。

关键代码:

(1) C3P0JdbcUtil.java

packageex4;
importjava.beans.PropertyVetoException;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importcom.mchange.v2.c3p0.ComboPooledDataSource;//重要
publicclass C3P0JdbcUtil {
public static Connection getConnection()throwsSQLException, PropertyVetoException{//完成初始化
       ComboPooledDataSourcecpds = new ComboPooledDataSource();
cpds.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
       cpds.setJdbcUrl("jdbc:sqlserver://localhost:1433");
       cpds.setUser("sa");
       cpds.setPassword("123456");
       cpds.setAcquireIncrement(5);
       cpds.setInitialPoolSize(10);
       cpds.setMaxPoolSize(20);
       returncpds.getConnection();
}
public static void release(Connection conn,Statementst,ResultSet rs){
       if(rs!=null){
              try{
                     rs.close();
              }catch(Exceptione){
                     e.printStackTrace();
              }rs=null;
       }
       if(st!=null){
              try{
                     st.close();
              }catch(Exception e){
                     e.printStackTrace();
              }
              st=null;
       }
       if(conn!=null){
              try{
                     conn.close();
              }catch(Exception e){
                     e.printStackTrace();
              }
              conn=null;
       }
}
}


(2)Main.java

packageex4;
importjava.beans.PropertyVetoException;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclass Main {
       public static void main(String[] args)throws PropertyVetoException{
       try{
              Connectionconn=C3P0JdbcUtil.getConnection();
              Statementstmt=conn.createStatement();
              Stringsql="select sn,sex from [EDUCATION].[dbo].[Student]";
              ResultSetrs=stmt.executeQuery(sql);
              while(rs.next()){
                     System.out.println(rs.getString("sn")+""+rs.getString("sex"));
              }
              C3P0JdbcUtil.release(conn,stmt, rs);
       }catch(SQLExceptione){
              e.printStackTrace();
       }
       }
}



分析:

1、多次建立connection连接很浪费资源, 每申请一个connection并关闭,效率低下。

数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。若无空闲连接,用户则等待其他用户释放。


2、数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:

最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作。

如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放。


3、主要参数:driver、url、username、Password、initialPoolSize、maxPoolSize


4、编写连接池需实现java.sql.DataSource接口。

DataSource接口中定义了两个重载的getConnection方法:

ConnectiongetConnection()

ConnectiongetConnection(String username, String password)

实现DataSource接口,在用户关闭connetcion的实例的时候,connection实例重新进入到连接池(改写方法)。


5、实现连接池的三种方式:手写DataSource实现类、使用dpcp、使用c3p0


6、配置文件一定要放在src下面(与类在同一目录下),且配置文件中的名字都是固定的。


7、在相应方法实现时一定要先导入相应的包。


8、Java中getResourceAsStream的用法

首先,Java中的getResourceAsStream有以下几种:

1Class.getResourceAsStream(String path) : path 不以‘/’开头时默认是从此类所在的包下取资源,以‘/’开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。

2Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以‘/’开头,最终是由ClassLoader获取资源。

3ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以‘/’开头无所谓,当然这和具体的容器实现有关。

4Jsp下的application内置对象就是上面的ServletContext的一种实现。


9、CP30可以实现名字绑定,连接多种数据库,常用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值