tomcat连接池中连接的重用是什么意思,能否举个例子讲解一下???

就是在tomcat配置完连接池后,编写一个java程序,程序部分代码如下:initialcontextinitc=newinitialcontext();contextc... 就是在tomcat配置完连接池后,编写一个java程序,程序部分代码如下:
initialcontext initc=new initialcontext();
context context=(context) initc.lookup("java:comp/env");
datasource ds=(datasource)context.lookup("jdbc/dbwater");
connection conn=ds.getconnection();
statement stmt=conn.createstatement();
.......省略SQL语句的执行......
conn.close(); 在这里连接还给了连接池
我想问的是conn这个connection对象是不是保存在了连接池中,当其它java程序使用同样地语句请求连接数据库时,即用connection conn=ds.getconnection()时,是否会将连接池中的conn直接用于此处。
如果其它java程序用别的connection对象名称请求数据库连接时,如connection ttt=ds.getconnection(),这时是不是会再连接池中新增加一条连接信息?

求高手详解!!!

顺便问下:现在jsp是不是没什么用了,怎么很多问题的答案都是05,06年的?
不要只解释重用的意思,看清楚我真正要问的,要代码,要例子。文绉绉的语言,书上已经很多了。
展开
 我来答
百度网友7868013
推荐于2016-11-23 · 超过12用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:36.8万
展开全部
tomcat中的几种连接池配置代码 对于大型网站来说,信息查询的次数会非常多,每次查询都需要这样的过程:加载驱动程序、创建连接、创建语句对象、执行SQL语句、关闭这些对象。建立与数据库之间的连接和释放连接会占用很多系统的时间。如果能够让所有用户共享连接,仅仅创建一次连接,谁需要连接谁就使用,这样可以大大减少创建连接所占用的时间。让所有用户共享连接,并且在需要的时候就能够使用,就需要有专门的机制来创建连接,数据库连接池(Dababase Connection Pool,简称DBCP)技术就是来解决这个问题的。
DBCP能够集中管理Web应用中的所有连接,提前创建好若干到数据库的连接,用户需要的时候从连接池中获取一个连接,用完之后重新把连接放回连接池。要使用DBCP,首先需要配置JNDI数据源。
配置JNDI数据源
DBCP可以使用很多技术实现,本书介绍的是比较流行的Jakarta-Commons的DBCP。
使用连接池的时候,存在一个问题。Web应用必须显式的关闭结果集对象、语句对象、连接对象,如果关闭失败,将导致这些对象不能重用。可能还会导致在连接使用完的时候,Web应用无法连接到数据库。
Jakarta-Commons的DBCP提供了一种机制,能够跟踪和恢复那些不能被管理的连接。要想跟踪和恢复那些不能被管理的连接,需要在配置数据源的时候增加下面的代码:
removeAbandoned="true"
当可用的连接数比较少的使用,连接池会查找并重复使用这些不能被管理的连接。可以使用removeAbandonedTimeout属性设置一个连接空闲多少秒之后被认为是已经被放弃的,默认值是300秒。如果想改为60秒,可以使用下面的代码:
removeAbandonedTimeout="60"
可以设置logAbandoned属性来记录没有正确释放连接的代码:
logAbandoned="true"
<!--局部数据库连接池(两种方法) Tomcat6.0连接池配置 -->

<!--第一种方法-->
配置server.xml
server.xml文件在Tomcat安装目录的conf子目录下。在</host>之前增加下面的代码:
<Context path="/bookstore" docBase="bookstore(项目名称)"
debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/connpool" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="j2ee"
password="j2ee"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
</Context>
<!--第二种方法-->
<Resource name="jdbc/connpool" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30"
maxWait="10000" username="j2ee" password="j2ee" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>

各属性的含义如下:
1 maxActive: 池中连接的最大数目。要确保把mysql的最大连接数大于这个值。如果为0,则没有最大数量限制。
2 maxIdle: 池中最大空闲数据库连接数。如果为-1,则没有限制。
3 axWait: 等待一个连接变成可用的最长时间,单位是ms,这个例子中是10秒,如果超时将抛出异常。如果设置为-1,将无限等待
4 username 和 password: 连接MySQL数据库的用户名和口令
5 driverClassName: MySQL数据库的JDBC驱动程序的名字,这里驱动的名字是com.mysql.jdbc.Driver。
6 url: JDBC连接MySQL数据库的url。参数autoReconnect=true确保连接池能够重新连接,如果8个小时没有操作,mysql管理器会关闭连接。
配置web.xml
需要为当前应用配置web.xml。主要作用是声明数据源。代码如下:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
使用连接池访问数据库
使用连接池访问数据库与使用JDBC直接访问数据库的过程基本相同,只是得到连接的方式不同。
下面的代码展示了在使用连接池的时候,如果获取到数据库的连接。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBPool {
private static DataSource pool;
static {
Context env = null;
try {
env = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource)env.lookup("jdbc/DBPool");
if(pool==null)
System.err.println("'DBPool' is an unknown DataSource");
} catch(NamingException ne) {
ne.printStackTrace();
}
}
public static DataSource getPool() {
return pool;
}
}
全局数据库连接池的配置:
1.将数据库驱动程序的JAR文件放在Tomcat的 common/lib 中;
2.在server.xml中设置数据源,以Oracle数据库为例,如下:
在<GlobalNamingResources> </GlobalNamingResources>节点中加入,
<Resource
name="jdbc/connpool"
type="javax.sql.DataSource"
password="j2ee"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="2"
maxWait="5000"
username="j2ee"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
maxActive="4"/>
属性说明:name,数据源名称,通常取”jdbc/XXX”的格式;
type,”javax.sql.DataSource”;
password,数据库用户密码;
driveClassName,数据库驱动;
maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
接将被标记为不可用,然后被释放。设为0表示无限制。
MaxActive,连接池的最大数据库连接数。设为0表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示
无限制。
3.在你的web应用程序的web.xml中设置数据源参考,如下:
在<web-app></web-app>节点中加入,
<resource-ref>
<description>MySQL DB Connection Pool</description>
<res-ref-name>jdbc/connpool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
子节点说明: description,描述信息;
res-ref-name,参考数据源名字,同上一步的属性name;
res-type,资源类型,”javax.sql.DataSource”;
res-auth,”Container”;
res-sharing-scope,”Shareable”;
<!--以下为设置数据源连接-->
<!--第一种-->
在tomcat\webapps\myapp\META-INF\context.xml的Context中增加:
<ResourceLink name="jdbc/connPool" global="jdbc/connPool" type="javax.sql.DataSource"/>
这样就可以了。
<!--第二种-->

在web应用程序的context.xml中设置数据源链接,如下:
在<Context></Context>节点中加入,
<ResourceLink
name="jdbc/connpool"
type="javax.sql.DataSource"
global="jdbc/connpool"/>
属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;
type,同样取”javax.sql.DataSource”;
global,同name值。

至此,设置完成,下面是如何使用数据库连接池。
1.建立一个连接池类,DBPool.java,用来创建连接池,代码如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBPool {
private static DataSource pool;
static {
Context env = null;
try {
env = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource)env.lookup("jdbc/DBPool");
if(pool==null)
System.err.println("'DBPool' is an unknown DataSource");
} catch(NamingException ne) {
ne.printStackTrace();
}
}
public static DataSource getPool() {
return pool;
}
}

2.在要用到数据库操作的类或jsp页面中,用DBPool.getPool().getConnection(),获得一个Connection对象,就可以进行数据库操作,最后别忘了对Connection对象调用close()方法,注意:这里不会关闭这个Connection,而是将这个Connection放回数据库连接池。
第三种:tomcat5.0连接池配置

1.打开server.xml:在<Context > </Contex>中添加如下连接池参数语句,一个完整的例子如下:
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="E:\Projects\ColorRing\wap" path="/wap" reloadable="true">
<Resource name="jdbc/wapOracle" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/wapOracle"> <!--这里name的值必须与Resource里的name的值相同-->
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@172.18.51.101:1521:sundb</value> <!--连接数据库的url-->
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>0</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>username</name> <!--用户名-->
<value>cms_user</value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
<parameter>
<name>password</name> <!--密码-->
<value>12345</value>
</parameter>
</ResourceParams>
</Context>

2.打开工程下的WEB-INF/web.xml,添加如下部分:
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/wapOracle</res-ref-name> <!--这里name的值也必须与server.xml中的Resource里的
name的值相同-->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

3.然后写连接数据库的语句:
package util;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class OracleDB {
String url_ = "192.168.1.41:1521:gxcring";
//String url_ = "172.18.51.101:1521:SUNDB";
String id_ = "cms_user";
String pass_ = "12345";

Connection conn = null;
Statement stmt = null;

public OracleDB() {
try {
//Class.forName("oracle.jdbc.driver.OracleDriver");
//conn = DriverManager.getConnection("jdbc:oracle:thin:@" + url_, id_, pass_);
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/wapOracle"); //注意这里的名字与配置文件
里的名字相同就行了。
conn = ds.getConnection();

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch (NamingException ne) {
System.out.println("Initial DataSource error.");
ne.printStackTrace();
} catch (SQLException e) {
System.out.println("ORACLE: " + e);
e.printStackTrace();
}
}

/**
* 返回Connction对象
* @param none
* @return Connction
*/
public Connection getConn() {
return this.conn;
}
}
百度网友bf750b0
2011-10-08 · TA获得超过147个赞
知道小有建树答主
回答量:183
采纳率:0%
帮助的人:81.2万
展开全部
和代码重用很像,
就是说,一个连接只生成一次,然后根据客户连接情况重复使用。
当客户使用完连接之后不是销毁它,而是把他保存起来,等下一个客户有需求的时候再拿 出来用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-10-08
展开全部
连接池,形象说你可以把它想象成一个图书馆,,里面书的数量就是连接池里面创建的连接数,谁想看书的时候就去拿一本(用户创建连接的时候就去连接池里面已经创建好的连接),看完就还回去(把建立的连接关闭掉,也就是是放回连接池)。等到下个用户想看已经归还的书的时候(有用户再次创建连接的时候)就可以把刚刚还回的书借给他(把关闭的连接重用,再次分配给用户)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ymiqplgao
2011-10-08 · TA获得超过646个赞
知道小有建树答主
回答量:512
采纳率:0%
帮助的人:393万
展开全部
连接池里根据配置信息保存着一定数据的可用连接,当用户去请求建立连接时,会自动寻找一个适合的连接并分配给用户,当用户释放连接时,对连接池来说实际上只是可用的连接数增加了一个,其实是仅仅和特定的用户断开了连接,当当前连接池全部占用的时候,用户发送的连接请求会被阻塞或直接抛弃。你可以认为是连接池里有固定的可连接数,状态分别是已建立连接和空闲状态。当然空闲状态过多时也可以设置关闭连接池中的可连接数的数量,没有可用连接时,再建建新的连接,也可以设置一次性创建连接数,以及最大连接数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
左潇龙
推荐于2018-04-02 · TA获得超过470个赞
知道小有建树答主
回答量:344
采纳率:0%
帮助的人:279万
展开全部
连接池中连接的重用。
就是说,连接池会给你创建好一定数量的连接,等着用户去用。
如果有人发出数据库请求,就拿一个给用户。
如果这个用户不用了,那么这个连接会放进连接池,处于空闲状态。(注意这是重点,连接池不会关闭连接,只会收回连接)
如果下次再有人用,可能这个放回去的就给他了。这不就重用了吗。
另外,连接池的连接,也不是绝对不会关闭。
这根设置有关,如果空闲连接太多,你可以通过设置相关参数,关闭一部分。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式