Tomcat6.x+struts1.x+MySQL5.x连接池问题

Posted on 2009-06-13 09:21 BBT_soft 阅读(1149) 评论(5)  编辑  收藏

1.在项目的WebRoot/META-INF下建context.xml文件,注意必须在该目录下,Tomcat会自动找这个文件,Tomcat6.0以后就不用在web.xml中配置了:

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" crossContext="true">

<Resource
name="jdbc/test" ----------注意:test为项目名
auth="Container"----------该项为不变项
type="javax.sql.DataSource"----------该项为不变项
driverClassName="com.mysql.jdbc.Driver"----------数据库驱动名
url="jdbc:mysql://localhost:3306/haotian?autoReconnect=true"-------url
username="root"-----用户名
password="root"------密码
maxActive="10"   ------最大连接数
maxIdle="5"     --------最大空闲连接数
maxWait="-1"/>   ------最大等待毫秒数,-1为无限等待

</Context>

2.连接类:

public class DBConnection {
private Connection conn=null;
public Connection getConnection(){
  
    //生成上下文对象,通过它可以向容器发送别名.
    Context context;
    try {
     context = new InitialContext();
     //查找对象
     DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/test");//jdbc/test为配置文件中的name
     //得到连接
     try {
      conn=ds.getConnection();
     } catch (SQLException e) {
      e.printStackTrace();
     }
    } catch (NamingException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   
   
   return conn;
}

3.把MySQL5.0的驱动包放到Tomcat的lib目录下,注意:是Tomcat的lib,而不是项目的lib。(不知道为什么会这样,之前不用这种连接池的时候放在项目的lib中就可以连接成功,但是现在就不可以,个人认为可能是context.xml使得Tomcat找自身lib中的驱动包,而不是项目中的驱动包)

4.测试:

这里并非是在连接类里面写个main()就可以测试成功的,如果这样会出现下面的错误:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at util.DBConnection.getConnection(DBConnection.java:26)
at util.DBConnection.main(DBConnection.java:49)

所以,只有通过和前台结合才能测试连接是否成功。

总结:

context.xml必须在项目的WebRoot/META-INF,Tomcat会自动找这个文件;

数据库驱动包必须放在Tomcat的lib目录下(可能是Tomcat会根据context.xml在自身的lib目录下找驱动包);

不可以直接在连接类中写main()测试,必须和前台结合;

Feedback

# re: Tomcat6.x+struts1.x+MySQL5.x连接池问题  回复  更多评论   

2009-06-13 10:59 by 天堂露珠
Tomcat配置JNDI数据源:
http://www.blogjava.net/wintys/archive/2009/06/12/java_tomcat_jndi_datasource.html

# re: Tomcat6.x+struts1.x+MySQL5.x连接池问题  回复  更多评论   

2009-06-13 14:14 by 隔叶黄莺
1. 驱动包放在哪里是由 Tomcat 中的类加载器层次决定的,虽然是配置在项目的 context.xml 中,但它的初始化是由 Tomcat 的 common 类加载器加载的,所以必须放在 Tomcat 的 lib 目录中。

2. 想在 main 方法中找到 jndi 资源,你需要考虑两方面的事情:
首先,那个连接池资源,未经 Tomcat 来初始化,也就没有 bind 到 jndi 上,所以你查询到。当然你可以手工用代码来 bind,不需要启动 Tomcat

其次你在查询连接池资源的时候,使用 InitialContext() 必须指定一个 Hashtable 参数,里面包含具体的 jndi 实现,例如 Tomcat 的 naming,具体如何指定请 google。因为在 Tomcat 容器中这些有关 JNDI 的环境变量是自动配置上的。

3. 还有一种情况,即使由 Tomcat 来初始化的连接池,在外部单独用 main 方法也未必能取到 Tomcat 中的 JNDI 资源,这要取决于 Tomcat 是否把资源暴露在外供其他应用程序使用。

所以楼主还有很多东西需要深入了解,ClassLoader 和 JNDI

# re: Tomcat6.x+struts1.x+MySQL5.x连接池问题  回复  更多评论   

2009-06-14 00:26 by BBT_soft
@天堂露珠
谢谢您的指点

# re: Tomcat6.x+struts1.x+MySQL5.x连接池问题  回复  更多评论   

2009-06-14 00:26 by BBT_soft
@隔叶黄莺
非常感谢您的指点,我是新手,还有很多东西要学

# re: Tomcat6.x+struts1.x+MySQL5.x连接池问题  回复  更多评论   

2009-06-16 08:59 by asdfsd
启动main当然会失败,tomcat没有启动,数据源是tomcat提供的,所以失败,如果你有专门的jndi服务器绑定,那就令当别论!!

只有注册用户登录后才能发表评论。


网站导航: