QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 771|回复: 6

Tomcat连接池问题,求教,谢谢。

[复制链接]
发表于 2004-10-15 20:09:11 | 显示全部楼层 |阅读模式
我在试图配置“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/Tomcat/common/lib”中。库里有表,表里有内容。

我测试的应用位于“/opt/prog/m/Webapps/typhoon.test_1”,在这个目录里有一个容器描述文件“typhoon.deployer/tomcat4.xml”,内容如下:
[code:1]
<Context path="/typhoon.test_1" docBase="/opt/prog/m/Webapps/typhoon.test_1"
        debug="0" privileged="true">

   <Resource name="jdbc/TestPool" type="javax.sql.DataSource"/>

   <ResourceParams name="jdbc/TestPool">

      <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>

   <ResourceLink name="jdbc/TestPool" global="jdbc/TestPool" type="javax.sql.DataSourcer"/>

</Context>
[/code:1]

我把这个容器描述文件复制为“/opt/prog/m/Tomcat/conf/Catalina/localhost/typhoon.test_1.xml”。

在该应用的目录下有应用描述文件“WEB-INF/web.xml”,内容为:
[code:1]
<?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/TestPool</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>

</web-app>
[/code:1]

应用中还有一个测试页“test_pool.jsp”,内容如下:
[code:1]
<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->



<%@ page import="javax.naming.Context" %>
<%@ page import="javax.sql.DataSource"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="java.sql.*"%>

<%
        DataSource ds = null;
        try
        {
                Context initCtx = new InitialContext();
                if (initCtx == null)
                {
                        out.println("Could not get \"Context\"!");
                }
                Context envCtx = (Context) initCtx.lookup("java:comp/env");
                ds = (DataSource)envCtx.lookup("jdbc/TestPool");
                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 t1");
                                out.println("prst is Ok!" + rst.next());
                                while(rst.next())
                                {
                                        out.println("STUDENT_NAME:" + rst.getString(2));
                                }
                                cn.close();
                        }
                        else
                        {
                                out.println("rst Fail!");
                        }
                }
                else
                {
                        out.println("Fail!");
                }
        }
        catch(Exception ne)
        {
                        out.println(ne);
        }
%>
[/code:1]

每次Tomcat启动时这个应用都能启动。在Tomcat管理器中对它进行“Stop”、“Start”和“Reload”操作,都显示“OK”。执行这个Web应用中不走连接池的程序也都OK,但是执行“test_pool.jsp”时就有问题了。这个测试页能运行,但似乎数据源或数据源配置有问题,页面显示如下:
[code:1]
Connection is OK! org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
[/code:1]

1.有人能解释一下这个异常的含义吗?
2.有人能告诉我怎样测试连接池是否已经启动吗?
3.怎样解决这个问题?
发表于 2004-10-15 21:08:08 | 显示全部楼层
没碰到过。 下载 http://cvs.apache.org/~dirkv/builds/showJNDI.jsp ,测试一下 JNDI 吧?
试试开 DEBUG, 再看 TOMCAT 的日志。
回复

使用道具 举报

 楼主| 发表于 2004-10-16 20:40:09 | 显示全部楼层
今天突然想到Tomcat4.1.30没删除,就把同样的东西拿过去试,能成,换5.5.2就奶了:-(
回复

使用道具 举报

 楼主| 发表于 2004-10-16 20:43:43 | 显示全部楼层
[quote:7bd3377074="dannycat"]没碰到过。 下载 http://cvs.apache.org/~dirkv/builds/showJNDI.jsp ,测试一下 JNDI 吧?
试试开 DEBUG, 再看 TOMCAT 的日志。[/quote]

KaKa,不支持JDK1.5.0!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2004-10-16 21:28:14 | 显示全部楼层
呵呵,原来台风兄是喜欢 live on the edge 的哈!

Alpha 版的 Tomcat,配以“language change”过的 JDK 5.0,先锋级的先锋
回复

使用道具 举报

 楼主| 发表于 2004-10-17 13:36:07 | 显示全部楼层
先将就着在4.1.30里跑吧。想把以前做的数据库操作器改成带连接池的,结果总出现连接被提前关闭的异常,而异常是由套在最底层的bean产生的,追查起来真麻烦。

现在,基本上追查到这个错误产生的位置了,但是不知道如何解决。

这个bean用于把结果集的输出变成HTML表格,以方便显示。它接收上级一个bean传过来的结果集,返回处理后的字符串、处理状态号、提示和产生的异常。

bean的代码如下:
[code:1]
/**
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;
        }
}
[/code:1]

一个使用连接池的上级bean调用这个bean时在“/opt/prog/m/Tomcat/log/catalina.out”里生成的相关部分记录为:
[code:1]
[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()]
[/code:1]

而一个不使用连接池的上级bean同样也调用这个bean却一切正常,在“/opt/prog/m/Tomcat/log/catalina.out”里生成的相关部分记录为:
[code:1]
[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()]
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-10-18 14:34:51 | 显示全部楼层
通过反复测试,我似乎找到问题所在了。上级的bean在调这个处理结果集的bean前,关闭了连接。我在JSP页中也做了模拟,关闭连接后再处理结果集,就会出异常。奇怪的是,在没用连接池的程序里就没这个问题。

对Java工作机制了解不深,猜测:
用连接池的程序一旦调用“连接.close()”,连接就立刻被连接池回收了,对于程序来说就是彻底关了;
不使用连接池的程序调用“连接.close()”,连接将由JVM的垃圾回收功能处理,而JVM不会立刻来回收,程序有时间从还没真正关闭的连接中进一步获取资料。

这个猜测还有待进一步测试。看起来大部分bean都得做点改动了。

有没有道理,我说了不算,大家看看。欢迎指教。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 10:45 , Processed in 0.084166 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表