Java使用c3p0连接数据库

1 篇文章 0 订阅

c3p0是一个开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,使用它的开源项目有Spring、Hibernate等。

c3p0和dbcp的区别:dbcp没有自动回收空闲连接功能,c3p0有该功能。

为什么使用连接池:在一般项目中操作数据库,每一次的操作都是建立一个连接,操作完成后才稀放连接,而JDBC不会保持连接的持续,超过一定的时间会稀放该连接。而建立新的连接都需要100多毫秒,从而耗费时间。若使用连接池进行池化连接,随时取用,平均每次取用仅需要15毫秒左右。在高并发随机访问数据库的情况下使用连接池能很好提高效率。

c3p0包下载地址:

https://sourceforge.net/projects/c3p0/files/latest/download?source=files

下载解压后将里面c3p0-0.9.5.2.jar、mchange-commons-java-0.2.11.jar包导入项目,如果连接的数据库不是oracle数据库,所以不需要导入c3p0-oracle-thin-extras包。

c3p0基本使用:(这里以连接MySQL数据库为例)。

常见配置项

user: 用户名  password :密码

driverClass:  驱动(如mysql驱动 com.mysql.jdbc.Driver)

jdbcUrl: 路径(如mysql路径 jdbc:mysql://localhost:3306/数据库名)

initalPoolSize:连接池初始化时创建连接数

acquireIncrement:连接池无空闲连接可用时,一次性创建的新连接数,默认值为3

maxPoolSize:连接池中拥有的最大连接数,默认值为15

minPoolSize:连接池中拥有的最小连接数

maxidelTime:连接最大空闲时间,如超过这时间,某个数据库连接还没使用则会断开该连接

,默认为0,0表示永远不会断开连接

maxConnectionAge:配置连接的生存时间,超过该时间则会自动断开并丢弃,默认值为0,表示不会对连接的生存时间进行限制。

maxIdleTimeExcessConnections:这个配合为减轻连接池的负载,配置不为0,则会将连接池的连接数量保持到minPoolSize,为0则不处理。

 

 

 

不使用配置文件:(先使用单元测试工具简单测试是否能获取到连接,实际应封装使用)

@Test

public void fun() throws PropertyVetoException, SQLException {

        //创建连接池对象   

ComboPooledDataSource dataSource = new ComboPooledDataSource();

    dataSource.setDriverClass("com.mysql.jdbc.Driver");//驱动

    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");//URL

    dataSource.setUser("root");//用户名

    dataSource.setPassword("12345");//密码

    //池参数基本配置

    dataSource.setMaxPoolSize(50);//设置连接池拥有的最大连接数。默认值15

    dataSource.setAcquireIncrement(5);//设置增量

    dataSource.setMinPoolSize(2); //设置连接池最少连接数

    dataSource.setInitialPoolSize(20); //连接池初始化创建的连接数。默认值3

    Connection conn = dataSource.getConnection();//得到连接

    System.out.println(conn);

    conn.close();//将连接还给连接池,而不是关闭连接}

输出:(获取到连接)

使用配置文件(一般使用这种方式)

使用配置文件的要求:配置文件名必须为c3p0-config.xml,而且需要放在src目录下,也可以使用properties文件配置,但文件名需要符合命名规范。

XML配置文件可以为多个数据源服务,提供了default-config和named-config两种配置方式,如项目中只用一个数据源,可使用default-config配置。

c3p0-config.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

<!-- 默认配置  创建连接池对象时,默认是加载该配置信息-->

<default-config>

<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="user">root</property>

<property name="password">12345</property>

<!-- 池参数 -->

<property name="acquireIncrement">5</property>

<property name="initialPoolSize">30</property>

<property name="minPoolSize">2</property><!--连接池中保留的最少连接数。-->

<property name="maxPoolSize">60</property><!--连接池中保留的最大连接数。-->

</default-config>

 

 

 

 

<!—oracle提供的配置 创建连接池对象时,可以指定命名加载配置信息-->

<named-config name="oracle-config">

<property name="jdbcUrl">jdbc:oracle:thin:@地址:端口:ORCL</property>

<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>

<property name="user">root</property>

<property name="password">12345</property>

<!-- 池参数 -->

<property name="acquireIncrement">3</property>

<property name="initialPoolSize">30</property>

<property name="minPoolSize">2</property>

<property name="maxPoolSize">50</property>

</named-config>

</c3p0-config>

//使用配置文件的默认配置 所以必须给出c3p0-config.xml

public void fun() throws PropertyVetoException, SQLException {

        //创建连接池对象

        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        Connection conn = dataSource.getConnection();

        System.out.println(conn);

        conn.close();//将连接还给连接池

        }

 

 

//使用配置文件的默认配置 所以必须给出c3p0-config.xml

public void fun() throws PropertyVetoException, SQLException {

//创建连接池对象,构造器的参数指定配置元素的名称,也就是配置文件中的named-configname

ComboPooledDataSource dataSource =

 new ComboPooledDataSource("oracle-config");

        Connection conn = dataSource.getConnection();

        System.out.println(conn);

        conn.close();//将连接还给连接池

        }

输出

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值