这两天一直在[痛苦]的配置Tomcat+MySQL的数据库连接池,搞了N长时间,脑袋都大了,现在终于搞定了.
有必要做一下详细记录啊~~~~~~
配置之前先是查看了大量的资料,虽然看起来配置过程似乎都不复杂也不是很难理解,不过自己一动手才发现完全不是那么一回事儿啊.
于是就开始了我痛苦的配置之旅....
首先在eclipse中打开tomcat 的server.xml找到当前工程的<context></context>
片断,在里面加入了<Resource>元素和一大堆参数,又在./WEB-INF/下的web.xml中使用<resource-ref>进行了引用,
我可是完全按照大家说的所配置的,但不只为什么还是问题多多...郁闷那!
刚一开始老是出现找不到绑定的JNDI资源的问题:
javax.naming.NameNotFoundException: 名称JDBC在上下文中没绑定
很明显是配置出了问题,于是我就查资料,发现还要在D:/Tomcat 5.5.26/conf/Catalina/localhost/下面新建个应用的xml文件,写上与server.xml中同样的内容.有点不解,网上说的都是配置全局数据源,可我只想用到单个应用里面的,
不知道是否还得配置.最后照着又做了.....(省略N次失败N次修改...)
还发现大家都说tomcat5.5与以前的5.0等版本配置上会有差别...晕啊
(看了下tomcat自带的说明文档的确和以前的不一样,不过倒是更简洁了,但是我配置成功之后又试了下以前的格式,也没有出问题啊,用的是5.5.26)
在解决上面那个问题时,好多人说MySQl配置连接池除了JDBC驱动还需要将一个包aspectjrt.ja放到D:/Tomcat 5.5.26/common/lib下面,我试了发现放不放对结果没影响啊...
后来那个绑定的问题不知道怎么就消失了...郁闷啊
好像是今天早上重新配了一遍就直接进到下面这个错误阶段了
突然想起前两天tomcat出了点问题,一直没修好,昨天晚上一气之下索性
重新下了个5.5.26的给重装了...看来是因为这个啊...
现在遇到的就是下面这个问题了
Cannot create JDBC driver of class '' for connect URL 'null'
..............
...............
Caused by: java.sql.SQLException: No suitable driver
刚开始没仔细思考,只看到上面的一句错误,搜索之后发现大家还是再说配置的问题,老天啊,我又来回检查了好几遍,真的觉得我的配置是一点问题都没有的啊,连个字母标点符号都没错啊....
就在快要崩溃时,看到了第二句错误,连起来才发现:原来上面的错误是由下面的造成的,我晕...怎么早先没看出来那...以前好像就曾因为JDBC版本的问题出现过毛病...
把mysql-connector-java-5.0.8.jar换成mysql-connector-java-3.1.14.jar
重启Tomcat,哈哈,整个世界终于变的美好了
整理配置代码如下:
Tomcat的server.xml------->>>
<Context docBase="netnote" path="/netnote"
reloadable="true" source="org.eclipse.jst.j2ee.server:netnote">
<Resource name="jdbc/netnote"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/gbook" <!-- 此处为该web应用的数据库名,注意不要写成web应用的名字或者JNDI资源的名字-->
username="root"
password="root"
maxIdle="30"
maxWait="5000"
maxActive="100" />
</Context>
应用WEB-INF/下面的web.xml----------->>>
(实际应用中xml中的中文注释要去掉)
<web-app>
<!-- 省略的servlet相关配置 -->
<!-- 下面引用配置好的JNDI资源-->
<resource-ref>
<description>mysql DB connection</description>
<res-ref-name>jdbc/netnote</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
用来测试的JSP中的主要代码
<%
String sql="select * from admins";
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
InitialContext ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/netnote");
conn=ds.getConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
while(rs.next()){
out.println(rs.getInt(1)+" "+rs.getString("username"));
}
}catch(NamingException e){
e.printStackTrace();
}
catch(SQLException e){
e.printStackTrace();
}catch(Exception e){
out.println("数据库驱动加载失败!"+e);
e.printStackTrace();
}finally{
}
%>
在这个过程中遇到了一些很有趣的问题,而且我现在也没搞明白是怎么回事.
如果不使用工具,手动创建web工程就需要在D:/Tomcat 5.5.26/conf/Catalina/localhost下面添加这个web应用对应的xml文件.
而如果在eclipse中新建一个工程,它会自动往tomcat的server.xml文件里的
<web-app>标签中写入相应的<context/>,而不是新建个<context> 片断.
以前我以为就是这样子的,不过这次才发现:
如果在eclipse中打开tomcat工程(默认生成的)下的server.xml会看到
在<web-app>中自动添加了相应的<context>片断,但是这时我们(不使用eclipse)再打开tomcat实际的server.xml会奇怪的发现<web-app>中竟然不存在我们刚才看到的<context>片断.
我对eclipse的机制也不了解,不清楚这到底是怎么一回事,唯一的解释我觉得
就是这两次看到的server.xml文件不是同一个文件,可能eclipse在内部做了一个映射.
~~~~~~~~总之就是搞不明百具体的原理,希望有人能告诉我是怎么一回事啊~~~~~~~
在此声明:
我以上的配置完全是使用eclipse打开xml进行配置并且成功的,如果部署发布应用时可能还需要在tomcat实际的文件中再进行配置.
位置应该就是D:/Tomcat 5.5.26/conf/Catalina/localhost和D:/Tomcat 5.5.26/webapps/具体web应用的名字/WEB-INF下面的xml文件了