是不是找不到org.apache.commons.dbcp.BasicDataSourceFactory类啊?容器外不清楚,容器内很简单:
Context initialContext = new InitialContext();
DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/MyDbPool");
Context initialContext = new InitialContext();
DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/MyDbPool");
解决方案 »
- 关于BufferedInputStream
- 关于多级目录数据导出到excel
- 下拉选框的问题
- spring的一些配置看不懂
- 大家对这个问题有什么好点子么?(客户要能自定义界面)
- 求marshall,unmarshall方面的资料
- 应用服务器与WEB服务器
- 正则表达式匹配的问题!
- JDOM中有个直接把RecordSet对象转化为XML片段的方法,昨天看过,今天忘记了。
- java.sql.SQLException: No operations allowed after statement closed问题
- 在linux下的java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit问题
- 登录验证的问题
就是我开始说的
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();
}
用commons-dbcp自己写一个好了
很简单的
到底是容器内还是外部?
你上面的代码上容器内的了上面的代码是在一般的类中写的。我想这不是tomcat范围内吧
我理解的是tomcat管理的只是jsp和action,form等刚才一想,我对这个概念其实挺模糊的。
当然我是配置的tomcat数据源,启动tomcat,然后再在一般的类中调用的上述的代码。
不知道这个算不算容器外呢?
我觉得问题出在无法加载org.apache.commons.dbcp.BasicDataSourceFactory,使用DBCP连接池需要包naming-factory-dbcp.jar,把它包含进来试试。测试下再说,谢谢回复
在容器外也能这样用?强的
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();
}
}
}
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
// 设置数据库驱动
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);