[返回首页] - [索引页面] - [文章列表]


主题:请问tomcat连接sql server是不是这样连?谢谢!




首先我安装了tomcat和jsdk,访问本地主页时候没有什么问题

接着我从Microsoft那里下载了sql server driver for JDBC ,安装了.

然后我又对server.xml和web.xml进行了配置

接下来测试,访问主页时一样没问题,但是访问testdb.jsp时就出现了问题.说是"cannot get Connection pool"

我好昏!不知怎么办!请高手指教,非常感谢!


回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 12:42:15  得分:0

我对tomcat的配置如下:

将sql server driver for JDBC 安装目录下的3个 *.jar文件拷贝到comcat\commom\lib下面

然后对server.xml添加如下内容:

<Context path="" docBase="ROOT" debug="0" reloadable="true">
<Resource name="jdbc/SqlServerDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/SqlServerDB">
<parameter>

<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>

<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>

<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://192.168.1.6:1433;databaseName=pubs</value>
</parameter>

//我的登陆用户名为sa,不知此处这样填对否?
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
//我的登陆密码为空,不知此处这样填对否?
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>

//没有删除example的代码,是否要删除?

web.xml添加代码如下:

<resource-ref>
<description>SqlServer Datasource example</description>
<res-ref-name>jdbc/SqlServerDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

结果还是不行,昏死了!麻烦大侠出手,不胜感激!
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 12:43:52  得分:0

root cause

java.sql.SQLException: cannot get Connection pool.
at org.apache.jsp.testdb_jsp._jspService(testdb_jsp.java:74)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:92)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:809)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:162)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:240)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:187)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:809)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Unknown Source)


TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 12:46:29  得分:5

配置没问题
代码中这样写
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/SqlServerDB");
Connection conn = ds.getConnection();

TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 12:57:19  得分:0

jFresH_MaN(TM)
我的代码是修改成你的样子,好像不行,不知我有没有写错

我原来的代码则是这样写的.

<%@ page contentType="text/html;charset=GB2312"%>
<%@ page language= "java"%>
<%@ page import= "java.sql.* "%>
<%@ page import= "javax.naming.* "%>

<%
try{
Context initCtx = new InitialContext();
Context envContext = (Context) initCtx.lookup("java:comp/env");

//获取连接池对象
Object obj = (Object) envContext.lookup("jdbc/SqlServerDB");
//DataSource ds= (DataSource)envContext.lookup("jdbc/SqlServerDB");
//Connection conn = ds.getConnection();

//类型转换
javax.sql.DataSource ds = (javax.sql.DataSource)obj;
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
//String strSql = " insert into test(id,name) values('00001','fany')";
String strSql;
//stmt.executeUpdate(strSql);
strSql = " select id,name from test ";
ResultSet rs = stmt.executeQuery(strSql);
if(rs.next()){
out.println(rs.getString(1));
out.println(rs.getString(2));
}

}catch(Exception ex){
ex.printStackTrace();
throw new SQLException("cannot get Connection pool.");
}

%>




TOP
回复人:jianghuxing(回头看看原来我一无所有)  四级(中级)  信誉:100      2005-4-9 13:01:55  得分:5

Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/SqlServerDB");
Connection conn = ds.getConnection();
TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 13:02:26  得分:10

如果你的web项目是部署在webapps里面的
你就要把<Resource>写在
<Host name="localhost" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
后面
TOP
回复人:zhutouzip(Speak out!-shyboy)  一星(中级)  信誉:112      2005-4-9 13:07:35  得分:5

在web.xml中加入:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/SqlServerDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

然后再在jsp中这样用:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/SqlServerDB");
Connection conn = ds.getConnection();
TOP
回复人:zhutouzip(Speak out!-shyboy)  一星(中级)  信誉:112      2005-4-9 13:12:35  得分:3

没看到,原来楼主是这样的!
你看看你的sqlserver的sa用户密码是否为空,最好设置一个密码吧!
我的配置你可以参考一下:
<Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true" crossContext="true">

<Logger className="org.apache.catalina.logger.FileLogger"
prefix="localhost_DBTest_log." suffix=".txt"
timestamp="true"/>

<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"/>

<ResourceParams name="jdbc/TestDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>

<!-- Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to 0 for no limit.
-->
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>

<!-- Maximum number of idle dB connections to retain in pool.
Set to 0 for no limit.
-->
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>

<!-- Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
-->
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>

<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value>12388321</value>
</parameter>

<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
-->


<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>

<!-- The JDBC connection url for connecting to your MySQL dB.
The autoReconnect=true argument to the url makes sure that the
mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
connection. mysqld by default closes idle connections after 8 hours.
-->
<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mywebdata1</value>
</parameter>
</ResourceParams>
</Context>

TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 13:12:37  得分:10

最简单的办法就是修改server.xml
<GlobalNamingResources>

<Resource name="jdbc/SqlServerDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/SqlServerDB">
<parameter>

<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>

<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>

<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://192.168.1.6:1433;databaseName=pubs</value>
</parameter>

//我的登陆用户名为sa,不知此处这样填对否?
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
//我的登陆密码为空,不知此处这样填对否?
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>


</GlobalNamingResources>

当然
web.xml里面仍然需要
<resource-ref>
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:16:20  得分:0

我的web项目是部署在webapps里面的.

你是说server.xml这部分代码

<Resource name="jdbc/SqlServerDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/SqlServerDB">
<parameter>

<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>

<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>

<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://192.168.1.6:1433;databaseName=pubs</value>
</parameter>

<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value>1111</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>


放在xml这部分代码

<!-- Define the default virtual host -->
<Host name="localhost" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false"
>

之后吗?

我这样放了,还是不行.

我不知有没有理解错?

盼答复!谢谢!!!
TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 13:20:14  得分:10

<GlobalNamingResources>

TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:23:36  得分:0

我的 <resource-ref> 放在</web-app>之前, </welcome-file-list>之后,不知对否?


<resource-ref>
<description>SqlServer Datasource example</description>
<res-ref-name>jdbc/SqlServerDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
TOP
回复人:zhutouzip(Speak out!-shyboy)  一星(中级)  信誉:112      2005-4-9 13:29:31  得分:2

<name>maxWait</name>
<value>-1</value>
把这个value值改大一点!试试
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:31:29  得分:0

jFresH_MaN(TM)大哥,我用了二种方法

1.把我们的代码剪切到<GlobalNamingResources>中间

<GlobalNamingResources>

<!-- Test entry for demonstration purposes -->
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>

<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users -->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved">
</Resource>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>

<Host name="localhost" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false"
>

<Resource name="jdbc/SqlServerDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/SqlServerDB">
<parameter>

<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>

<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>

<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://192.168.1.6:1433;databaseName=pubs</value>
</parameter>

<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value>1111</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>

</GlobalNamingResources>


2.在我们的代码前面和后面添加<GlobalNamingResources>和</GlobalNamingResources>,都不行,不知怎么办了?


真的麻烦你了!非常感谢!!


TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 13:32:44  得分:10

现在是什么异常?
还是java.sql.SQLException: cannot get Connection pool.?

TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:33:19  得分:0

zhutouzip(Speak out!-shyboy) :

多谢!

不过我改大了,也是不行.

可否再帮忙查一下?
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:34:07  得分:0

jFresH_MaN(TM)大哥 :

现在是什么异常?
还是java.sql.SQLException: cannot get Connection pool.?

----------------------------------

是啊
TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 13:35:06  得分:10

<GlobalNamingResources>
中间只要<Resource>和<Resource-Params>
你别把<host>还有最后的</contex>写进去啊
这样tomcat启动解析就有问题
TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 13:37:12  得分:10

是<ResourceParams>

你重新启动一下tomcat
我觉得不可能啊
我这样为什么能行
我已经仔细看了你的配置了
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:50:46  得分:0

我重新启动了一下,发现那个tomcat没有写"服务器已成功启动"而是一列英文,闪了一下就过去了,不知有没有问题??

还是老样子.
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 13:58:55  得分:0

jFresH_MaN(TM):

我重新安装和配置一下,再向你请教吧,非常感谢你的帮忙!!
TOP
回复人:temptation81(向左.向右.向前)  一级(初级)  信誉:100      2005-4-9 14:00:01  得分:5

好象大家都把注意力集中在配置文件上了,我有个比较笨的办法,那就是在配置环境变量classpath时,把你的sqlserver驱动一起加在classpath后面就可以了
或者也可以把这些驱动压缩文件直接放在tomcat/common/bin下(具体路径我记的不太清楚了,只要放在bin目录下就可以了)
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 14:15:30  得分:0

jFresH_MaN(TM):

你好!

我重新安装了一遍,tomcat启动后能够看到一个dos界面,我便用test.jsp连接本地服务器,结果tomcat的dos界面说No suitable driver.

我现在该怎么办呢?我已经将D:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib目录下的jar文件全部拷贝到E:\Program Files\Apache Group\Tomcat 4.1\common\lib里面了啊!


TOP
回复人:jFresH_MaN(TM)  两星(中级)  信誉:158      2005-4-9 14:18:54  得分:15

呵呵,你的问题比较大啊
这样吧,给我你的QQ,我帮你解决你的问题
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 14:18:58  得分:0

temptation81(向左.向右.向前):

你说的驱动压缩文件是那些jar文件吗?thx!
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 14:19:30  得分:0

好的,非常感谢!

281949689
TOP
回复人:is02hua(萝卜)  一级(初级)  信誉:100      2005-4-9 22:31:10  得分:0

解决的办法:

原来是path没有设置,后来在jFresH_MaN(TM)指导下,将path和docBase设置成绝对路径之后,并将一些代码移动到恰当位置,所有问题就都解决了。

jFresH_MaN(TM)的解决方法不仅可以用DriverManage()连接,也可以用连接池连接。

在此再次感谢jFresH_MaN(TM)。
TOP


该问题已经结贴 ,得分记录:jFresH_MaN(5)、jianghuxing(5)、jFresH_MaN(10)、zhutouzip(5)、zhutouzip(3)、jFresH_MaN(10)、jFresH_MaN(10)、zhutouzip(2)、jFresH_MaN(10)、jFresH_MaN(10)、jFresH_MaN(10)、temptation81(5)、jFresH_MaN(15)、