昨天用XML实现了个小留言本的功能 ,今天想换成数据库的,因为用了接口,所以中间还是比较容易转换的
但是,当在tomcat里实现数据库连接池的时候就是错误不断,先看看代码
TOMCAT_HOME/conf/Catalina/localhost/webtest.xml
< Context docBase ="D:ApacheTomcatwebappswebtest" path ="/webtest" >
<!-- dbPool begin -->
< Resource name ="jdbc/webtest" auth ="Container" type ="javax.sql.DataSource" />
< ResourceParams name ="jdbc/webtest" >
< parameter >
< name > factory </ name >
< value > org.apache.commons.dbcp.BasicDataSourceFactory </ value >
</ parameter >
< parameter >
< name > username </ name >
< value > root </ value >
</ parameter >
< parameter >
< name > password </ name >
< value > 123456 </ value >
</ parameter >
< parameter >
< name > url </ name >
< value > jdbc:mysql://localhost:3306/webtest </ value >
</ parameter >
< parameter >
< name > maxActive </ name >
< value > 20 </ value >
</ parameter >
< parameter >
< name > maxIdle </ name >
< value > 10 </ value >
</ parameter >
< parameter >
< name > maxWait </ name >
< value > 30 </ value >
</ parameter >
< parameter >
< name > driverClassName </ name >
< value > com.mysql.jdbc.Driver </ value >
</ parameter >
</ ResourceParams >
<!-- dbPool end -->
</ Context >
web.xml部分
< resource-ref >
< res-ref-name > jdbc/webtest </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< res-auth > Container </ res-auth >
</ resource-ref >
<!-- DB pool end -->
程序里的
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DBConnectionManager ... {
// private static DBConnectionManager manager = null;
private static Log logger = LogFactory.getLog(DBConnectionManager.class);
private static DataSource ds = null;
static ...{
try...{
Context context = new InitialContext();
if(context==null&&logger.isInfoEnabled())...{
logger.info("在DBConnectionManager里创建Context失败");
}
context =(Context) context.lookup("java:comp/env");
ds = (DataSource) context.lookup("jdbc/webtest");
}catch(NamingException ne)...{
ne.printStackTrace();
}
}
public static Connection getConnection()...{
Connection conn = null;
try ...{
conn = ds.getConnection();
} catch (SQLException e) ...{
// TODO 自动生成 catch 块
if(logger.isDebugEnabled())...{
logger.debug(e.getMessage());
}
e.printStackTrace();
}
return conn;
}
}
但是当开启tomcat的时候老是有
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
异常,所以在网上找了好多
有效的一中解决方案是
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
在Server.xml中设置如下
<Resource name="jdbc/cardsystem" type="javax.sql.DataSource" password="123456" driverClassName="com.mysql.jdbc.Driver" maxIdle="2" maxWait="5000" username="root" url="jdbc:mysql://localhost:3306/CardSystemDemo?autoReconnect=true&useUnicode=true&characterEncoding=GB2312" maxActive="100"/>
然后在WebApp的Context.xml中加入
<ResourceLink name="jdbc/cardsystem" global="jdbc/cardsystem" type="j
avax.sql.DataSource"/>
就一点问题都没有
还有,如果不配置server.xml的话
直接在Context.xml中加入
<Resource name="jdbc/cardsystem" type="javax.sql.DataSource" password="123456" driverClassName="com.mysql.jdbc.Driver" maxIdle="2" maxWait="5000" username="root" url="jdbc:mysql://localhost:3306/CardSystemDemo?autoReconnect=true&useUnicode=true&characterEncoding=GB2312" maxActive="100"/>
也是可以正常的运行
但是如果Context.xml中的是
<Resource auth="Container"
name="jdbc/cardsystem"
global="jdbc/cardsystem"
scope="Shareable"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/cardsystem">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/CardSystemDemo?autoReconnect=true&useUnicode=true&characterEncoding=GB2312</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value>123456</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>3000</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>100</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
</ResourceParams>
的话,就是有问题!!!!!!!!