day04----连接池

这段时间家里有事,然后自己也颓了一段时间,但是后面还是要陆陆续续的补起来,路还长,不能太早下结论。。。

数据库连接池的作用:一次性批量制造一些连接connection对象放入连接池中,即在系统初始化时,将数据库连接作为对象存储在内存中,要使用时就从池子里面取出一个连接使用,当用完不需要时,再把连接放入池子中;达到了复用连接,避免了不断的创建关闭连接,从而达到优化

数据库连接池和JDBC:数据库连接池是分配、管理、释放数据库连接,提高对数据库操作的性能;JDBC是一种用于执行sql语句的Java API,为多种关系数据库提供统一访问;

开源的数据库连接池技术

1、DBCP数据库连接池,Apache上的一个Java项目,Tomcat使用的连接池组件;使用dbcp需要两个架包:commons--dbcp.jar、commons-pool.jar

  //硬编码的方式实现连接池
    public void testDbcp() throws Exception{
        //dbcp连接池核心类
        BasicDataSource dataSource = new BasicDataSource();
        //连接池参数配置:连接字符串,驱动,用户,密码,初始化连接数,最大连接数,最大空闲时间
        dataSource.setUrl("jdbc:mysql:///jdbc_demo");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("1234");
        dataSource.setInitialSize(3);
        dataSource.setMaxActive(6);
        dataSource.setMaxIdle(3000);
        //获取连接
        Connection connection = dataSource.getConnection();
        connection.prepareStatement("delete from admin where id=2").executeUpdate();
        //关闭
        connection.close();
    }

    //配置方式实现,便于维护
    public void testProp() throws Exception{
        //加载配置文件
        Properties properties = new Properties();
        //获取文件流
        InputStream inputStream = DbcpTest.class.getResourceAsStream("db.properties");
        //加载属性配置文件
        properties.load(inputStream);
        //根据配置,直接创建数据源对象
        DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
        //获取连接
        Connection connection = dataSource.getConnection();
        connection.prepareStatement("delete from admin where id = 1").executeUpdate();
        connection.close();
    }
  db.properties文件
  url = jdbc:mysql:///jdbc_demo
  driverClassName = com.mysql.jdbc.Driver
  username = root
  password = 1234
  initialSize = 3
  maxActive = 6
  maxIdle = 3000

2、C3P0开源的JDBC连接池,实现了数据和JNDI 的绑定,目前使用它的开源项目有hibernate、spring

2.1、JNDI:Java命名和目录接口,主要作用在于:可以把java对象放在一个容器中(JNDI容器),并为容器中的Java对象去一个名称,以后程序想要获取Java对象,只需通过名称检索即可;其核心API为context,代表JNDI容器,lookup方法为检索对象中对应名称的对象

//硬编码的方式,使用c3p0连接池管理连接
    public void testC3P0() throws Exception{
        //创建连接池核心工具类
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //连接池参数配置:连接字符串,驱动,用户,密码,初始化连接数,最大连接数,最大空闲时间
        dataSource.setJdbcUrl("jdbc:mysql:///jdbc_demo");
        dataSource.setConnectionTesterClassName("com.mysql.jdbc.Driver");
        dataSource.setUser("root");
        dataSource.setPassword("1234");
        dataSource.setInitialPoolSize(3);
        dataSource.setMaxPoolSize(6);
        dataSource.setMaxIdleTime(3000);
        //获取连接对象
        Connection connection = dataSource.getConnection();
        connection.prepareStatement("delete from admin where id = 2").executeUpdate();
        connection.close();
    }

//配置文件方式
    public void TestPro() throws Exception{
        //创建c3p0连接池核心工具类
        //自动加载src下c3p0的配置文件
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        PreparedStatement ps = null;
        Connection connection = dataSource.getConnection();
        for (int i = 0; i < 11; i++)
        {
            String sql = "insert into admin (name,age) values(?,?)";
            ps = connection.prepareStatement(sql);
            ps.setString(1, "july"+i);
            ps.setInt(2, 10);
            ps.executeUpdate();
        }
        ps.close();
        connection.close();
    }

<!-- c3p0-config.xml -->
<c3p0-config>
    <default-config>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">3</property>
        <property name="maxPoolSize">6</property>
        <property name="maxIdleTime">1000</property>
    </default-config>

    <named-config name="oracle_config">
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">3</property>
        <property name="maxPoolSize">6</property>
        <property name="maxIdleTime">1000</property>
    </named-config>
</c3p0-config>

3、Proxool:Java数据库连接池技术,sourceforge下的一个开源项目,关键在于这个连接池提供监控的功能

4、DBCP和C3P0的区别:前者没有自动回收空闲连接的功能,后者有自动回收空闲连接的功能

时间: 2024-10-24 15:13:36

day04----连接池的相关文章

20连接池

一.c3p0连接池 1.导包(lib 下) 数据库连接池 c3p0-0.9.5.2.jar machange-commons-java-0.2.11.jar MySQL驱动 mysql-connector-java-8.0.11.jar 2.核心方法 // 核心连接池类 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); // 设置四个JDBC基本连接属性 comboPooledDataSource

oracle database resident connection pooling(驻留连接池)

oracle在11g中引入了database resident connection pooling(DRCP).在此之前,我们可以使用dedicated 或者share 方式来链接数据库,dedicated方式是oracle数据库默认的链接方式,无需过多的配置,而且关于dedicated的bug也是非常少的,因此,通常情况下,建议使用dedicated方式来链接数据库.但是,在服务器资源有限,并且同时连接数据库的用户量非常大时,dedicated方式就无能为力了.假设并发用户为5000,每个d

缓冲池,线程池,连接池

SSH:[email protected]:unbelievableme/object-pool.git   HTTPS:https://github.com/unbelievableme/object-pool.git 缓冲池 设计要点:包含三个队列:空缓冲队列(emq),装满输入数据的输入的队列(inq),装满输出数据的输出队列(outq),输入程序包括收容输入(hin),提取输入(sin),输出程序包括收容输出(hout)和提取输出(sout). 注意点:输入程序和输出程序会对缓冲区并发访

DBCP连接池使用问题

问题现象: 启动应用,访问无压力,一切正常,一段时间过后,应用访问异常. 问题分析: 1.web容器线程爆满,拒绝服务.由于应用并发量大,线程响应时间长增加,线程池连接数逐步递增直到爆满,导致应用拒绝服务. 2.通过对线程信息的分析,发现线程处理时间都卡在连接数据库中,通过对数据库服务器的检查,数据库是没有问题的. 3.通过查询服务器日志,发现数据库连接异常:连接超时. 4.查询DBCP连接池连接使用情况,空闲链接和使用链接还正常. 问题思考: 从以上信息可以确认,问题一定出在应用层,并且是应用

一种利用ADO连接池操作MySQL的解决方案(VC++)

VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连接永远不关闭,直接数进程退出),但是这样做至少会引起两个问题:(1)资源竞争,多个数据库请求操作不能同时进行,后一请求必须要等到前一请求完成后才能进行:(2)多线程情况下容易出现混乱,甚至出现资源异常释放.还有一种方法,就是使用数据库时创建连接,使用完后关闭连接回收资源.这种方式在数据库操作频繁的情

mongodb or操作与连接池

mongodb # 类似于sql中的in或者or操作 mulites field query: db.cool.find({$or:[{field1:'val'},{'field2':'val'}-]}) # 类似于sql中的like操作 db.coo.find('name': /m/) == sql like pymongo 使用 {'field':{$regex: keyword}} http://stackoverflow.com/questions/3305561/how-do-i-qu

JBoss配置连接池

什么是数据库连接池? 配置连接池为的是解决效率问题.因为每创建一个连接都是很耗时的,有了连接池,就可以提前放一些连接进去.以后我们再用连接就去连接池里面取而不是每次都创建.但是我们知道连接池是有上限的,如果只允许我们放10个,那么当这10个连接都被占用的时候,下一个用户再来请求连接将不能得到,只好等待,如果等的时间太长了就会抛出timeout的异常.使用完连接后要释放,否则会一直占着资源,当连接全部被占用而得不到释放时,就会出现错误... JBoss实现了J2EE的13个规范包括JNDI,JND

DBCP连接池与c3p0连接池

1.   DBCP连接池 2.  c3p0连接池(参见上一篇的使用步骤http://www.cnblogs.com/qlqwjy/p/7545012.html)

redis 连接池 - 转载

所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar Jedis操作步骤如下:1->获取Jedis实例需要从JedisPool中获取:2->用完Jedis实例需要返还给JedisPool:3->如果Jedis在使用过程中出错,则也需要还给JedisPool: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; imp

redis mysql 连接池 之 golang 实现

分享一下 golang 实现的 redis 和 mysql 连接池,可以在项目中直接引用连接池句柄,调用对应的方法. 举个栗子: 1 mysql 连接池的使用 (1) 在项目子目录放置 mysql.go (2)在需要调用的地方导入连接池句柄 DB (3)调用 DB.Query() 2 redis 连接池的使用 (1)在项目子目录放置 redis.go (2)在需要调用的地方导入连接池句柄 Cache (3)调用 Cache.SetString ("test_key", "te