tomcat6 连接池的问题

aimiracle 2008-12-24 04:41:36
我使用的是tomcat6.0,sqlserver2000,
首先,我在自己的项目下面的META-INF下面新建了一个context.xml,内容如下:
<context>
...
<resource name="jdbc/test" auth="container" type="javax.sql.DataSource" maxActive="100"
maxIdle="30" maxWait="100" username="sa" password="123" driverClassName="com.microsoft.jdbc,sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test">
</context>
然后,在tomcat/conf/server.xml里加入了<context path="" docBase="sys" debug="0" reloadable="true"/>

我在调试程序的时候,报以下错误:
javax.naming.NameNotFoundExcption:Name jdbc is not bound in this Context

请问要怎么解决呀,不是程序的问题,因为如果我把<resource....>写到tomcat/conf/context.xml里又不会报错,能正确的运行,但是,我希望能写在自己的项目下面,请各们帮帮忙!
...全文
308 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
aimiracle 2008-12-26
  • 打赏
  • 举报
回复
to:cooliceman
这不是连接oracle的呀,呵呵。。也能用来连SQL2000吗?
lijiaof16 2008-12-26
  • 打赏
  • 举报
回复
使用连接池需要注意的有:
1,如果使用MyEclipse 工具,用的Tomcat是外部的Tomcat(即你的Tomcat6.0 ),如果用连接池必须将配置文件写到Tomcat下的tomcat/conf/context.xml 里,数据库连接的jar包放在tomcat 的lib下
2,如果想在自己工程下用连接池,必须写配置文件(.properties)文件
下面是dbconfig.properties文件的内容(配置文件放在src下)
#SQL Bridge Connection
#driverClassName=jdbc.odbc.JdbcOdbcDriver
#url=jdbc:odbc:databaseName
#username=sa
#passowrd=sa

#SQL 2005
#driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;databaseName=myrestrant
#username=sa
#password=sa

#MySQL
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myrestrant
username=root
password=root

#连接池配置
defaultAutoCommit=true

initialSize=4

maxActive=3

maxIdle=3

minIdle=0

maxWait=2000

------------------------------------------------------------------------------
注意:#号代表注释,要注意连接池的配置defaultAutoCommit表示键,后面的true表示值。其它都一样!
-----------------------------------------------------------------------------
下面是连接的类:
package org.jiao.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.log4j.Logger;

public class ConnectionFactory {

Logger logger=Logger.getLogger("ConnectionFactory");

private Connection con=null;
private static ConnectionFactory factory=null;
private Properties pro=null;
private DataSource ds=null;

//私有构造,单例模式
private ConnectionFactory(){

}

//获得ConnectionFacotory实例的方法
public static ConnectionFactory instance()
{
if(factory==null)
{
factory=new ConnectionFactory();
}
return factory;
}

//获得读取配置文件类的Property的对象的方法
private void getProperties()
{
pro=new Properties();
try {
pro.load(Thread.currentThread().getContextClassLoader().
getResourceAsStream("org/jiao/dao/impl/dbconfig.properties"));
} catch (Exception ex) {
ex.printStackTrace();
// TODO: handle exception
logger.debug("ConnectionFactory类读取配置文件发生错误: " + ex);
logger.error("ConnectionFactory类读取配置文件发生错误: " + ex);
logger.warn("ConnectionFactory类读取配置文件发生错误: " + ex);
logger.fatal("ConnectionFactory类读取配置文件发生错误: " + ex);
}
}

//获得连接的方法
public Connection getCon()
{
try {
if(ds==null)
{
this.getProperties();
ds=BasicDataSourceFactory.createDataSource(pro);
}
con=ds.getConnection();
} catch (Exception ex) {
// TODO: handle exception
ex.printStackTrace();
logger.debug("数据库连接错误: "+ex);
logger.error("数据库连接错误: "+ex);
logger.warn("数据库连接错误: "+ex);
logger.fatal("数据库连接错误: "+ex);
}
return con;
}

//关闭的方法
public void doClose(ResultSet rs,PreparedStatement pr,Connection con)
{
if(rs!=null)
{
try {
rs.close();
}
catch (SQLException ex) {
logger.debug("关闭结果集发生错误: "+ex);
logger.error("关闭结果集发生错误: "+ex);
logger.warn("关闭结果集发生错误: "+ex);
logger.fatal("关闭结果集发生错误: "+ex);
}
}
if(pr!=null)
{
try {
pr.close();
}
catch (SQLException ex1) {
logger.debug("关闭pr发生错误: "+ex1);
logger.error("关闭pr发生错误: "+ex1);
logger.warn("关闭pr发生错误: "+ex1);
logger.fatal("关闭pr发生错误: "+ex1);
}
}
if(con!=null)
{
try {
con.close();
}
catch (SQLException ex2) {
logger.debug("关闭连接发生错误: "+ex2);
logger.error("关闭连接发生错误: "+ex2);
logger.warn("关闭连接发生错误: "+ex2);
logger.fatal("关闭连接发生错误: "+ex2);
}
}
}

//关闭的方法
public void doClose(ResultSet rs,Statement stmt,Connection con)
{
if(rs!=null)
{
try {
rs.close();
}
catch (SQLException ex) {
logger.debug("关闭结果集发生错误: "+ex);
logger.error("关闭结果集发生错误: "+ex);
logger.warn("关闭结果集发生错误: "+ex);
logger.fatal("关闭结果集发生错误: "+ex);
}
}
if(stmt!=null)
{
try {
stmt.close();
}
catch (SQLException ex1) {
logger.debug("关闭pr发生错误: "+ex1);
logger.error("关闭pr发生错误: "+ex1);
logger.warn("关闭pr发生错误: "+ex1);
logger.fatal("关闭pr发生错误: "+ex1);
}
}
if(con!=null)
{
try {
con.close();
}
catch (SQLException ex2) {
logger.debug("关闭连接发生错误: "+ex2);
logger.error("关闭连接发生错误: "+ex2);
logger.warn("关闭连接发生错误: "+ex2);
logger.fatal("关闭连接发生错误: "+ex2);
}
}
}

public static void main(String[] args) {
try {
System.out.println(ConnectionFactory.instance().getCon().isClosed());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
------------------------------------------------------------------------------
注意此连接池用到三个jar包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar,外加一个mysql-connector-java-5.1.5-bin.jar(即你的数据库jar)
------------------------------------------------------------------------------
3,如果你用JBuilder工具,因为JBuilder工具用的是内置的Tomcat,所以它必须用读取配置文件的方式来用连接池!
aimiracle 2008-12-26
  • 打赏
  • 举报
回复
to :zou_wei_forever
我测试了,好像和jar包放在哪里没有多大的关系,我去掉了项目下面的jar,运行时会报错,去掉tomcat下面的jar包运行,同样也报错,两个都保留着,还是报错,都是报同样的错:javax.naming.NameNotFoundExcption:Name jdbc is not bound in this Context
cooliceman 2008-12-26
  • 打赏
  • 举报
回复
在WEB-INF的web.xml中添加
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/你的xml文件名</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
连接数据库时的代码也有变化
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
conn = DriverManager.getConnection("proxool.xml-test");
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
cooliceman 2008-12-26
  • 打赏
  • 举报
回复
好像不能在web应用中的xml文件中直接配置连接池,我也在网上看到过这样的文章,结果弄了一天也没弄出来,后来才明白,那人说的还是在tomcat中配置,要想在应用中直接配置,可以用第三方的jar包我后来用的是proxool,在web应用的web-inf下新建一个xml文件,在其中写
<proxool>
<alias>xml-test</alias>
<driver-url>jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=gb2312</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<statistics>1m,15m,1d</statistics>
<driver-properties>
<property name="user" value="你的用户名你的密码"/>
<property name="password" value=""/>
</driver-properties>
<maximum-connection-count>100</maximum-connection-count>
<minimum-connection-count>25</minimum-connection-count>
<maximum-active-time>8000</maximum-active-time>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
我连的是mysql,其它的数据库方法类似,然后在应用的WEB-INF/lib下放proxool的jar文件,我的jar文件名是proxool-0.9.ORC3.JAR,这个你可以去网上下。希望能对楼主有所帮助。
jerry_008808 2008-12-26
  • 打赏
  • 举报
回复
学习一下
blueram 2008-12-26
  • 打赏
  • 举报
回复
<!-- The contents of this file will be loaded for each web application -->
<Context>

<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Resource
name="jdbc/drp"
type="javax.sql.DataSource"
password="root"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/drp"
maxActive="4"/>

</Context>


我直接放进去META-INF可以呀,不知道楼主家这句没有
aimiracle 2008-12-26
  • 打赏
  • 举报
回复
问题解决了,非常感谢大家的帮忙,特别要感谢cooliceman。。

非常感谢哦!!!
aimiracle 2008-12-26
  • 打赏
  • 举报
回复
问题还没有解决呀,请大伙帮帮忙,有谁实现了把配置文件放在自己的项目下,请教教我啊!
chenggil10 2008-12-25
  • 打赏
  • 举报
回复
<context path="" docBase="sys" debug="0" reloadable="true"/>
这个是不是错了啊,他说向下文里没有绑定相符的名字的jdbc
sunboard 2008-12-25
  • 打赏
  • 举报
回复
驱动要放到项目的lib下面
aimiracle 2008-12-25
  • 打赏
  • 举报
回复
你好,我按你说的做了,在项目下面的web.xml里面加入了
<resource-ref>
<description>DB Connection </description>
<res-ref-name>jdbc/mysql </res-ref-name>
<res-type>javax.sql.DataSource </res-type>
<res-auth>Container </res-auth>
</resource-ref>
运行还是报错,报以下的错误:
org.apache.tomcat.dbcp.dbcp.SQLNestedExcepiton:Cannot create JDBC driver of class '' for connect URL 'null'
flylovejings 2008-12-25
  • 打赏
  • 举报
回复
com.microsoft.jdbc,sqlserver.SQLServerDriver
很明显有错误么!
com.microsoft.jdbc.sqlserver.SQLServerDriver

你用的是sql2000 放jar包放在tomcat common--lib下
qqqqqwwqqq 2008-12-25
  • 打赏
  • 举报
回复
端口号 数据库名字 用户名 密码 都核对下
zou_wei_forever 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aimiracle 的回复:]
引用 10 楼 zou_wei_forever 的回复:
将sql2000的数据库驱动放到tomcat的lib目录下就可以了,
不要放到项目的lib目录下。

我把sql2000的数据库驱动放到tomcat的lib目录下,也放以了项目的lib目录下,两个LIB下面都有,还是报错。
[/Quote]
建议将项目的lib目录下的驱动去掉,可能有冲突,因为先是找的项目的lib目录下的,没找到再去tomcat的lib目录下找。
aimiracle 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sunboard 的回复:]
<context path="" docBase="sys" 这个可不能乱写啊 path表示表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/**** docBase 应用程序的路径或者是WAR文件存放的路径

这个是我的 <Context reloadable="true" crossContext="true" path="/Tumuwang" docBase="Tumuwang"
[/Quote]
如果改成了<context path="/sys" docBase="sys" debug="0" reloadable="true"/>的话,那么,在访问页面的时候就要加上/sys,比如说:http://localhost:8080/sys/index.jsp,而且改成这样后运行同样报错:
javax.naming.NameNotFoundExcption:Name jdbc is not bound in this Context
sunboard 2008-12-25
  • 打赏
  • 举报
回复
<context path="" docBase="sys" 这个可不能乱写啊 path表示表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/**** docBase 应用程序的路径或者是WAR文件存放的路径

这个是我的 <Context reloadable="true" crossContext="true" path="/Tumuwang" docBase="Tumuwang"
aimiracle 2008-12-25
  • 打赏
  • 举报
回复
请大家伙帮帮忙哦
dengdajun 2008-12-25
  • 打赏
  • 举报
回复
<!-- The contents of this file will be loaded for each web application -->
<Context>

<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->

<!--sql 2005-->
<Resource name="DataSourceName" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="sa" password="sa" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;databaseName=DB name"/>


</Context>


以上是SQL 2005 的配置,千万别忘了访驱动到tomcat \lib 目录下
aimiracle 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zou_wei_forever 的回复:]
将sql2000的数据库驱动放到tomcat的lib目录下就可以了,
不要放到项目的lib目录下。
[/Quote]
我把sql2000的数据库驱动放到tomcat的lib目录下,也放以了项目的lib目录下,两个LIB下面都有,还是报错。
加载更多回复(7)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧