A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈晓东 黑马帝   /  2011-10-12 19:41  /  4013 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是java的数据连接池。他的工作机制是什么样的?

6 个回复

正序浏览
何创 中级黑马 2012-10-25 17:49:39
7#
连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
回复 使用道具 举报
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被 使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超 过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
*Web应用中如何在tomcat上配置数据连接池和使用结合struts;in server.xml*/
1)建立工程后首先在tomcat的server.xml的<Host/>标签中添加<Context/>如下所示:(如果是myEclipse IDE 请在tomcat\conf\用记事本打开
        server.xml配置文件进行更改)
<Host>
<Context docBase="studentPro" path="/studentPro" reloadable="true" source="org.eclipse.jst.j2ee.server:studentPro">//这是固定模式docBase的值是工程名称
        /*<Resource>配置dbcp要求的数值:driverClassName;name;auth;username;password;type;url这几项必须的*/
        <Resource  driverClassName="com.mysql.jdbc.Driver" auth="Container" maxActive="40" maxIdle="20" maxWait="5000" name="jdbc/student" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/teacher_studentdb" username="root" password="root"/>
                       
</Context>
</Host>


//in web.xml配置如下代码       
<resource-ref>
                <description>datasource</description>
                <res-ref-name>jdbc/student</res-ref-name>//与server.xml中的name属性值匹配即是jndi名称
                <res-type>javax.sql.DataSource</res-type>//与server.xml中的type属性值匹配
                <res-auth>Container</res-auth>//容器管理
        /*提示:这四项是必须的而且不能颠倒顺序*/
</resource-ref>

/*以下代码演示如何查找jndi和如何获得链接*/
        Context text=new javax.naming.InitialContext();
                DataSource ds=null;
                       
                if(text!=null){
                System.out.println("test is successed!!");
                        ds=(DataSource)text.lookup("java:comp/env/jdbc/student");
                        Connection sqlCon=null;
                        if(ds!=null){
                                System.out.println("DataSource is connected!!");
                                sqlCon=ds.getConnection();
                                if(!sqlCon.isClosed()){
                                        System.out.print("连接 是open!!");
                                }
                        }
成功输出如下结果:test is successed!!
                 DataSource is connected!!
                 连接 是open!!

其他说明:5.5版本一定要把DriverClass的jar包copy到tomcat\common\lib之中;
        获得的数据源一定是java.sql.DataSource类型;
        server.xml和web.xml文件中的配置大小写敏感;
        6.0要把DriverClass的jar驱动包copy到lib包下并且添加common-pool.jar common-dbcp.jar包到
        lib目录下

/***在hibernate中如何使用DBCP***/
在hibernate.cfg.xml配置文件中添加标签<property name="connection.datasource">java:comp/env/jdbc/student</property>
重要说明:java:comp/env/jdbc/student  是有严格要求的:前半部必须是:java:comp/env/ 后半部 jdbc/student 是tomcat中jndi的名称
既是<Resource/>标签属性name的值(必须匹配)如果书写有误则抛出not find datasource 异常

请去掉利用jdbc的其他配置保留<property name="dialect">org.hibernate.dialect.....</property>标签

评分

参与人数 1技术分 +1 黑马币 +8 收起 理由
wangfayin + 1 + 8 赞一个!

查看全部评分

回复 使用道具 举报
程序和数据库建立连接,发送数据操作的指令,完成后断开连接。等下一次请求的时候重复这个过程,即每个请求都需要和数据库建立连接和断开连接,这样当数据量大的时候系统的消耗是很大的。连接池就是为了解决这个问题:在一个空间中预先建立好一定数量的连接,当程序请求数据时直接使用池中的现存的连接,不需要重复建立连接和断开的过程,节省了时间提高了性能

评分

参与人数 1黑马币 +4 收起 理由
wangfayin + 4 赞一个!

查看全部评分

回复 使用道具 举报
黄锋 黑马帝 2011-10-12 20:21:46
藤椅
数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个。
就比如打我们日常打电话时都是先拿起电话,然后拨号,之后就是等待连接,直到对方应答,电话除了普通电话外还有一种热线电话,打热线电话时,主叫可以马上与被叫方进行通话,这是因为,热线电话一方一般是几个或者几十个电话,对外是相同的号码,当有电话打入的时候,只要有一个空闲电话就马上与其进行通话,这就好像已经建立了多个连接,当用户访问的时候,马上为其分配一个空闲资源

评分

参与人数 1黑马币 +4 收起 理由
wangfayin + 4 赞一个!

查看全部评分

回复 使用道具 举报
宁超 黑马帝 2011-10-12 20:09:59
沙发
连接池就是在加载的时候将所有的数据库连接放到缓冲区,每次要获得连接就从池子里面取,而不用直接从数据库里面取,这样能提高连接速度,这时候可以跟数据库是异步的状态(根据你的事务状态来确定)就是说当你添加数据的时候,页面反馈的确实数据已经添加了,但是这时候数据不在数据库!存在缓冲区,当你的事务完成了以后,数据再提交到数据库中。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

评分

参与人数 1技术分 +1 黑马币 +4 收起 理由
wangfayin + 1 + 4 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马