Tomcat5.5.2问题,求教,谢谢。
我在试图配置“Jakarta-Tomcat-5.5.2”下一个Web应用的连接池时碰到了问题。中英文资料都查过一些,但是问题没有解决。下面是最近一次的状况。我测试用的数据库是“PostgreSQL-7.3.4”下的“test_d_1”,可访问的用户为“test_u_1”,口令为“test_p_1”。数据库服务器端口为“5432”,驱动为“org.postgresql.Driver”。库里有表,表里有内容。
我测试的应用位于“/opt/prog/m/Webapps/typhoon.test_1”,在这个目录里有一个容器描述文件“typhoon.deployer/tomcat4.xml”,内容如下:
<Context path="/typhoon.test_1" docBase="/opt/prog/m/Webapps/typhoon.test_1"
debug="0" privileged="true">
<Resource name="jdbc/Test_Pool" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/Test_Pool">
<parameter>
<name>driverClassName</name>
<value>org.postgresql.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:postgresql://127.0.0.1:5432/test_d_1</value>
</parameter>
<parameter>
<name>username</name>
<value>test_u_1</value>
</parameter>
<parameter>
<name>password</name>
<value>test_p_1</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>4</value>
</parameter>
</ResourceParams>
</Context>
我把这个容器描述文件链接为“/opt/prog/m/Tomcat/conf/Catalina/localhost/typhoon.test_1.xml”。
在该应用的目录下有应用描述文件“WEB-INF/web.xml”,内容为:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>
Typhoon.Free.Wolf's Lab
</display-name>
<description>
Typhoon.Free.Wolf's Lab for experimentations.
</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Test_Pool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
应用中还有一个测试页“test_pool.jsp”,里面的中文部分因操作不慎而丢失,但是结构还没坏。内容如下:
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.sql.DataSource,java.util.*"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<%
DataSource ds = null;
try
{
Context ctx = new InitialContext();
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Test_Pool");
Hashtable t=ctx.getEnvironment();
out.print("<BR>ctx.getEnvironment() = "+t);
out.print("<BR>ds = "+ds);
if(ds!=null)
{
try
{
Connection con = ds.getConnection();
/**
Connection con = ds.getConnection();
if(con!=null)
{
DatabaseMetaData dbmeta=con.getMetaData() ;
out.print("<br><b>????</b>"+dbmeta.getUserName());
out.print("<br><b>?? ??? ???? ! ???????????</b>");
try
{
con.close();
}
catch(Exception e)
{
}
}
else
{
out.print("<br><b>????2?</b>???? ?");
}
*/
}
catch(Exception e)
{
out.print("<br>ERR=="+e);
}
}
else
{
out.println("Fail!");
}
}
catch(Exception ne)
{
out.println(ne);
}
%>
每次Tomcat启动时这个应用都能启动。在Tomcat管理器中对它进行“Stop”、“Start”和“Reload”操作,都显示“OK”。执行这个Web应用中不走连接池的程序也都OK,但是执行“test_pool.jsp”时就有问题了。这个测试页能运行,但似乎数据源或数据源配置有问题,页面显示如下:
ctx.getEnvironment() = {java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory, java.naming.factory.url.pkgs=org.apache.naming}
ds = org.apache.tomcat.dbcp.dbcp.BasicDataSource@15575e0
ERR==org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
1.有人能解释一下这个异常的含义吗?
2.有人能告诉我怎样测试连接池是否已经启动吗?
3.有人能提供一个测试连接池的JSP例子吗(bean的不敢奢求)? http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jndi-datasource-examples-howto.html 。
按照这个配置连Tomcat都起不来。稍稍把数据源的名字修改了一下,然后基本上彻底贯彻这里的说明,结果基本上彻底失败。
http://www.sicbbs.com/photo/albums/userpics/10150/tomcat.failed.jpg 突然想到Tomcat4.1.30还没删,就把这堆东西拿过去,一试,跑的跟上了油一样。不解 :?
先将就着在4.1.30里跑吧。想把以前做的数据库操作器改成带连接池的,结果总出现连接被提前关闭的异常,而异常是由套在最底层的bean产生的,追查起来真麻烦。
现在,基本上追查到这个错误产生的位置了,但是不知道如何解决。
这个bean用于把结果集的输出变成HTML表格,以方便显示。它接收上级一个bean传过来的结果集,返回处理后的字符串、处理状态号、提示和产生的异常。
bean的代码如下:
/**
Instruction:
A bean to convert the "ResultSet" into a Table for html after SQL-selecting. Uses && provides TFW-Standard-Interface.
return 0: Every thing goes on well.
return 1: Exception somewhere.
return 2: Exception while input or output.
return 3: Exception caused by no class or no file found.
return 4: Exception with SQL.
New version modified much, still need to do futher test.
介绍:
一个把SQL查询“结果集”变成字html表格的组件。使用和提供TFW标准接口。
返回0: 一切正常。
返回1:有地方异常。
返回2: 有输入输出异常。
返回3: 有文件或类未找到的异常。
返回4: SQL操作异常。
新版本改动很大,还需要进一步测试。
Guide:
"deal(ResultSet rs)".
package AA.BB...NN;Use this while package in pack "AA.BB...NN". Attention, the pack must be placed in one of the "CLASSPATH"s.
指引:
“deal(ResultSet rs)”。
package AA.BB...NN;
如果要打到 “AA.BB...NN” 包里,就添加这些。注意,包必须放置在其中一处“CLASSPATH”下。
*/
package jsp_db_oprt;
import java.lang.*;
import java.sql.*;
public class RS_deal_3
{
//>>Put out.
private static int stat=0;
private static String text="";
private static String str_out="";
private static Exception excp_rtn=null;
//<<Put out.
//>>Get in.
private static int mode=0;
private static char LG='E';
private static int GUI=0;
//<<Get in.
public static int rs_deal(ResultSet rs)
{
String string_1="[Start public static String deal()]";
String string_2="[Ended public static String deal()]";
System.out.println(string_1);
System.out.println(" <Version: 0.9.1+ Alpha 2004-10-17-02>\n -- Provide TFW-Standard-Interface.\n -- Set NULL after useing.\n -- Connection-Pool testing ...");
stat=0;
text="";
str_out="";
excp_rtn=null;
int i1,i2,i3;
i1=i2=i3=0;
ResultSetMetaData rsmd=null;
int numbCols=0;
String nameCols="";
String l_s="<tr>";//line_start
String l_e="</tr>";//line_ended
String c_s="<td>";//colum_start
String c_e="</td>";//colum_ended
String s1="";
String s2="";
try
{
rsmd=rs.getMetaData();
numbCols=rsmd.getColumnCount();
System.out.println("001 ... OK");
System.out.println("Number of colums in this table is: "+numbCols);
i1=1;s2=l_s;
while(i1<=numbCols)
{
s1=rsmd.getColumnName(i1);
s2=s2+c_s+s1+c_e;
//System.out.print("\t"+s1);
i1++;
System.out.println("002 ... OK");
}
System.out.println("003 ... OK");
s2=s2+l_e;
System.out.println("004 ... OK");
System.out.println(s2);
//System.out.print("\n");
//System.out.print("\n");
System.out.println("005 ... OK");
while(rs.next())
{
System.out.println("006 ... OK");
i1=1;
s2=s2+l_s;
while(i1<=numbCols)
{
s1=rs.getString(i1);
s2=s2+c_s+s1+c_e;
//System.out.print("\t"+s1);
i1++;
}
s2=s2+l_e;
//System.out.print("\n");
}
System.out.println("007 ... OK");
s1="<table>"+s2+"</table>";
rs.close();
}
catch(SQLException e1)
{
excp_rtn=e1;stat=4;
//System.out.println("Exception caught: "+excp_rtn);
}
rsmd=null;
rs=null;
str_out=s1;
//System.out.println(str_out);
System.out.println(string_2);
return stat;
}
public static String notice()
{
String string_1="[Start public static String notice()]";
String string_2="[Ended public static String notice()]";
System.out.println(string_1);
if(stat==0)
{
text="Every thing goes on well.";
}
else if(stat==2)
{
text="Exception while input or output.";
}
else if(stat==3)
{
text="Exception caused by no class or no file found.";
}
else if(stat==4)
{
text="Exception with SQL.";
}
else
{
text="Exception somewhere.";
}
System.out.println(string_2);
return text;
}
public static String result()
{
String string_1="[Start public static ResultSet result()]";
String string_2="[Ended public static ResultSet result()]";
System.out.println(string_1);
System.out.println(string_2);
return str_out;
}
public static Exception exception()
{
String string_1="[Start public static Exception exception()]";
String string_2="[Ended public static Exception exception()]";
System.out.println(string_1);
System.out.println("Exception caught: "+excp_rtn);
System.out.println(string_2);
return excp_rtn;
}
}
一个使用连接池的上级bean调用这个bean时在“/opt/prog/m/Tomcat/log/catalina.out”里生成的相关部分记录为:
[Start public static String deal()]
<Version: 0.9.1+ Alpha 2004-10-17-02>
-- Provide TFW-Standard-Interface.
-- Set NULL after useing.
-- Connection-Pool testing ...
001 ... OK
Number of colums in this table is: 3
002 ... OK
002 ... OK
002 ... OK
003 ... OK
004 ... OK
<tr><td>uid</td><td>truename</td><td>nikname</td></tr>
005 ... OK
[Ended public static String deal()]
[Start public static String notice()]
[Ended public static String notice()]
[Start public static ResultSet result()]
[Ended public static ResultSet result()]
[Start public static Exception exception()]
Exception caught: Connection is closed.Operation is not permitted.
[Ended public static Exception exception()]
STATU:
4
NOTICE:
Exception with SQL.
EXCEPTION:
Connection is closed.Operation is not permitted.
[Ended public static int bridge()]
[Start public static String result()]
[Ended public static String result()]
[Start public Exception exception()]
Exception caught: Connection is closed.Operation is not permitted.
[Ended public Exception exception()]
而一个不使用连接池的上级bean同样也调用这个bean却一切正常,在“/opt/prog/m/Tomcat/log/catalina.out”里生成的相关部分记录为:
[Start public static String deal()]
<Version: 0.9.1+ Alpha 2004-10-17-02>
-- Provide TFW-Standard-Interface.
-- Set NULL after useing.
-- Connection-Pool testing ...
001 ... OK
Number of colums in this table is: 3
002 ... OK
002 ... OK
002 ... OK
003 ... OK
004 ... OK
<tr><td>uid</td><td>gid</td><td>passwd</td></tr>
005 ... OK
006 ... OK
006 ... OK
006 ... OK
006 ... OK
006 ... OK
007 ... OK
[Ended public static String deal()]
[Start public static String notice()]
[Ended public static String notice()]
[Start public static ResultSet result()]
[Ended public static ResultSet result()]
[Start public static Exception exception()]
Exception caught: null
[Ended public static Exception exception()]
通过反复测试,我似乎找到问题所在了。上级的bean在调这个处理结果集的bean前,关闭了连接。我在JSP页中也做了模拟,关闭连接后再处理结果集,就会出异常。奇怪的是,在没用连接池的程序里就没这个问题。
对Java工作机制了解不深,猜测:
用连接池的程序一旦调用“连接.close()”,连接就立刻被连接池回收了,对于程序来说就是彻底关了;
不使用连接池的程序调用“连接.close()”,连接将由JVM的垃圾回收功能处理,而JVM不会立刻来回收,程序有时间从还没真正关闭的连接中进一步获取资料。
这个猜测还有待进一步测试。看起来大部分bean都得做点改动了。
有没有道理,我说了不算,大家看看。欢迎指教。
页:
[1]