看到十二章访问数据库,跃跃欲试因为连好数据库后我就要真正开始着手于我的数据库驱动的网站了。 但是书上的范例是用JDBC-ODBC桥驱动的MS Access数据库,URL等信息都是在ODBC里面配置好的,所以即使我能找到driverClassName="oracle.jdbc.OracleDriver",却也找不到配置URL的地方。
书上遍数了连接池的种种好处,我忍不住直接翻到二十四章建立连接池,因为这里连的是Oracle(水平还只到照猫画虎:)。照着书上的办法,修改了server.xml和web.xml之后,从网上找来一段也是用来测试连接池的脚本,可以显示出来DataSource的对象建立成功,Connection却不行,报错无法建立class for url null。(在这个重要时刻google竟然又崩了我找不到搜索的历史,没法原样贴出来了)继续搜啊搜,终于看到很多网页说,Tomcat 5.5与5.0的server.xml配置方法不一样,在5.0上面的很多标签,变成了5.5的参数。先开始没有重视,但后来众口一词,还有一篇说参见Tomcat文档。
我的Tomcat是6.0,当然和5.0也不一样啦,也准备到Tomcat网站找文档,因为E文也还是将就着能看的。但是官网连不上,其他网站找来找去也没有找到文档的下载。只好直接照着那些网上的例子改吧。结果改完之后,也还是一样,郁闷。到晚上,忽发奇想重启系Tomcat之后,竟然成功了!可知很多时候Tomcal是要重启才生效的。可是,,,定睛一看,还没有完全搞定,ResultSet没有取到字段值。但是到这一步已经说明连接池建立成功了,喜不自胜。
做事就要做完整,看看ResultSet为什么出不来。测试代码全是抄的,每个类和方法是什么用意全都不知道,查文档吧。到JDK 1.6的安装目录下看到中文的说明,链接到文档下载页面,我直接在线翻阅。第一次翻JDK手册感觉真奇妙,很容易就从JDBC入手找到了所有了类和方法,赞一个。原来问题出在ResultSet的next方法上,我查询的这个表只有一行记录,代码直接执行while(rst.next()),那就直接false掉了,所以取不到字段值啊。搞清之后,把while去掉,只取第一行记录,再测试,果然OK!改良一下,把while(rst.next())改成do-while(rst.next()),对付我这种只有一行记录的表就没有问题了。
/conf/server.xml里面添加如下,注意这里很多参数都曾是5.0版本里面的标签,还有一定要加在Host之间。
< Resource name ="jdbc/mousie" auth ="Container"
type ="javax.sql.DataSource" driverClassName ="oracle.jdbc.OracleDriver"
url ="jdbc:oracle:thin:@127.0.0.1:1521:mousie"
username ="mousie" password ="mousie" maxActive ="20" maxIdle ="10"
maxWait ="-1" />
</ Context >
</ Host >
应用目录的web.xml添加:
< description > Oracle Datasource example </ description >
< res-ref-name > jdbc/mousie </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< res-auth > Container </ res-auth >
</ resource-ref >
用来测试的dbtest.jsp:
<% @ page import = " javax.sql.DataSource " %>
<% @ page import = " javax.naming.InitialContext " %>
<% @ page import = " java.sql.* " %>
<%
DataSource ds = null ;
try ... {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)envCtx.lookup("jdbc/mousie");
if(ds!=null)...{
out.println("Connection is OK!");
Connection cn=ds.getConnection();
if(cn!=null)...{
out.println("cn is Ok!");
Statement stmt = cn.createStatement();
ResultSet rst = stmt.executeQuery("select * from tophotter");
out.println("<p>rst is Ok!</p>" + rst.next());
do ...{
out.println("<P>BOOK_CODE:" + rst.getString("username"));
}
while(rst.next());
cn.close();
}
else...{
out.println("rst Fail!");
}
}
else
out.println("Fail!");
} catch (Exception ne) ... { out.println(ne);
}
%>