是不是找不到org.apache.commons.dbcp.BasicDataSourceFactory类啊?容器外不清楚,容器内很简单:
Context initialContext = new InitialContext();
DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/MyDbPool");

解决方案 »

  1.   

    我觉得问题出在无法加载org.apache.commons.dbcp.BasicDataSourceFactory,使用DBCP连接池需要包naming-factory-dbcp.jar,把它包含进来试试。
      

  2.   

    是这样的容器外配置是需要传一个参数进去的。
    就是我开始说的
    Hashtable env = new Hashtable();这个哈希表应该包含一些参数,可以我的还是出问题。如下:
    javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.commons.dbcp.BasicDataSourceFactory [Root exception is java.lang.ClassCastException]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:652)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
    at javax.naming.InitialContext.init(InitialContext.java:219)
    at javax.naming.InitialContext.<init>(InitialContext.java:195)
    at datasource.TomcatDSTest.DBManager(TomcatDSTest.java:74)
    at datasource.TomcatDSTest.main(TomcatDSTest.java:23)
    Caused by: java.lang.ClassCastException
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:649)
    ... 5 more
    java.lang.NullPointerException
    at datasource.TomcatDSTest.main(TomcatDSTest.java:27)
    Exception in thread "main" 
    错误是在conn = ds.getConnection();这句出的
    程序如下:
    DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/MyDbPool");
    Connection conn ;
    ResultSet rs = null;
    try{
    conn = ds.getConnection();
    String sql = "select * from ammm";
    Statement stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    showRS(rs);
    }catch(SQLException e){
    e.printStackTrace();
    }
      

  3.   

    不太明白你为什么需要在tomcat外来调用tomcat的datasource
    用commons-dbcp自己写一个好了
    很简单的
      

  4.   

    worinia()
    到底是容器内还是外部?
    你上面的代码上容器内的了上面的代码是在一般的类中写的。我想这不是tomcat范围内吧
    我理解的是tomcat管理的只是jsp和action,form等刚才一想,我对这个概念其实挺模糊的。
    当然我是配置的tomcat数据源,启动tomcat,然后再在一般的类中调用的上述的代码。
    不知道这个算不算容器外呢?
      

  5.   

    pdvv(我爱花猫) 
    我觉得问题出在无法加载org.apache.commons.dbcp.BasicDataSourceFactory,使用DBCP连接池需要包naming-factory-dbcp.jar,把它包含进来试试。测试下再说,谢谢回复
      

  6.   

    DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/MyDbPool");
    在容器外也能这样用?强的
      

  7.   

    package com.mas.db;import java.sql.*;
    import java.util.Properties;import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.naming.Reference;
    import javax.naming.StringRefAddr;import javax.sql.DataSource;public class DBPool {
        private static DataSource pool;
        static {
             //Context env = null;          
                 // env = (Context) new InitialContext().lookup("java:comp/env");
               //         pool = (DataSource)env.lookup("jdbc/DBPool");
                  InitialContext initialContext = null;
                    try
    {                
    initialContext = getInitialContext();
    pool = (DataSource) initialContext.lookup("jdbc/DBPool");
    if(pool==null)
    System.out.println("查找连接池失败!");
    } catch (Exception e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }               if(pool==null) 
                      System.err.println("'DBPool' is an unknown DataSource");
                   
          }
        public static DataSource getPool() {
            return pool;
        }    
        private static  InitialContext getInitialContext() throws Exception 
        {
            String url = "jdbc:mysql://192.168.2.201:3306/mastest";
            String user = "mastest";
            String password = "mastest";
            Properties properties = null;
            try 
            {
            
    //         InitialContext ic = new InitialContext();
    //
    //            // Construct BasicDataSource reference
    //            Reference ref = new Reference("javax.sql.DataSource",
    //                "org.apache.commons.dbcp.BasicDataSourceFactory", null);
    //            ref.add(new StringRefAddr("driverClassName",
    //                "com.mysql.jdbc.Driver"));
    //            ref.add(new StringRefAddr("url",
    //             url));
    //            ref.add(new StringRefAddr("username", user));
    //            ref.add(new StringRefAddr("password", password));
    //            ic.rebind("mySqlDS", ref);
                
                properties = new Properties();
                properties.put(Context.INITIAL_CONTEXT_FACTORY,
                               "org.apache.commons.dbcp.BasicDataSourceFactory");
               // org\apache\tomcat\dbcp\dbcp
                
                properties.put(Context.PROVIDER_URL, url);
                if (user != null) 
                {
                    properties.put(Context.SECURITY_PRINCIPAL, user);
                    properties.put(Context.SECURITY_CREDENTIALS,
                                   password == null ? " " : password);                
                }
                return new InitialContext(properties);
            } 
            catch(Exception e) 
            {
                throw e;
            }
        }
        public static void main(String args[])
        {
         DataSource ds = DBPool.getPool();
         try
    {
         if(ds!=null)
         {
    Connection conn = ds.getConnection();
    if(conn!=null)
    {
    System.out.println("conn is not null!");
    }
         }
    } catch (SQLException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
        }
    }
      

  8.   

    javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.commons.dbcp.BasicDataSourceFactory [Root exception is java.lang.ClassCastException]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:652)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
    at javax.naming.InitialContext.init(InitialContext.java:219)
    at javax.naming.InitialContext.<init>(InitialContext.java:195)
    at com.mas.db.DBPool.getInitialContext(DBPool.java:78)
    at com.mas.db.DBPool.<clinit>(DBPool.java:27)
    Caused by: java.lang.ClassCastException
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:649)
    ... 5 more
    'DBPool' is an unknown DataSource
      

  9.   

    用下面这段即可                                BasicDataSource ds= new BasicDataSource();
    // 设置数据库驱动
    ds.setDriverClassName("org.gjt.mm.mysql.Driver");
    // 设置JDBC的URL
    ds.setUrl("jdbc:mysql://localhost/test");
    ds.setUsername("root");
    ds.setPassword("root");
    // 设置连接池初始大小
    bdds.setInitialSize(2); javaURLContextFactory j = new javaURLContextFactory();

    // JNDI配置
    Hashtable env = new Hashtable();
    env.put("java.naming.factory.initial",
    "org.apache.naming.java.javaURLContextFactory");
    InitialContext ctx = new InitialContext(env); // 数据源绑定到JNDI
    ctx.bind("tomcatDS", ds);
    // 在JNDI查找数据源
    DataSource ds = (DataSource) ctx.lookup("tomcatDS");
    Connection con = ds.getConnection();
    log.info(con.toString());
    Statement stmt = con.createStatement();
        String strSql = "select * from diary";
        ResultSet rs = stmt.executeQuery(strSql);