4

Tomcat 7.0.22を実行していて、SQLAnywhere12.0データベースに接続する単純なサーブレットを作成しました。サーブレットを実行すると、java.lang.ClassCastExceptionが発生します。org.apache.tomcat.dbcp.dbcp.BasicDataSourceをorg.apache.tomcat.jdbc.pool.DataSourceにキャストできません。私の./META-INF/content.xmlファイルは次のようになります。

<Context>
  <Resource name="jdbc/FUDB"
           auth="Container"
           type="javax.sql.DataSource"
           username="dba"
           password="sql"
           driverClassName="sybase.jdbc.sqlanywhere.IDriver"
           factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

url = "jdbc:sqlanywhere:uid = dba; pwd = sql; eng = BTH476331A_FedUtilization;" accessToUnderlyingConnectionAllowed = "true" maxActive = "8" maxIdle = "4" />

私のwebappweb.xmlは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">
    <display-name>FedUtilization</display-name>  
    <servlet>
  <servlet-name>Report1</servlet-name>
      <display-name>Report1</display-name>
      <servlet-class>com.sapgss.ps.servlet.Report1</servlet-class> 

Report1 / Report1
SQLAnywhere12.0.1サーバーjdbc3jdbc/FUDBjavax.sql.DataSourceコンテナ

サーブレットコードは次のとおりです。

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import org.apache.catalina.core.StandardContext.*;
import org.apache.tomcat.jdbc.pool.*;
import com.sapgss.ps.dbutil.*;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;

public class Report1 extends HttpServlet {

    public void doGet(HttpServletRequest request,

HttpServletResponse response)throws IOException、ServletException {try {response.setContentType( "text / html"); PrintWriter out = response.getWriter(); out.println( ""); out.println( ""); out.println( "Hello Elaine!"); out.println( ""); out.println( ""); out.println( "

こんにちはエレイン!

");
//これは、Javaでデータベースへのアクセスをコーディングする方法です。ContextinitCtx = new InitialContext(); Context envCtx =(Context)initCtx.lookup(" java:comp / env "); DataSource ds =(DataSource)envCtx .lookup( "jdbc / FUDB");接続conn = ds.getConnection();。。。
}}}

次の行でデータソースを取得しようとすると、エラーが発生します。DataSource ds =(DataSource)envCtx.lookup( "jdbc / FUDB");

よろしくお願いします。髪を抜いています。

4

3 に答える 3

9

私の場合、置くのを忘れただけです:

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

私の中で/tomcat7/conf/context.xml。追加しただけで、すべて正常に機能しました。

私のcontext.xml:

<Context> 
    <Resource name="jdbc/gestrel" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://127.0.0.1:5432/g...."
    username="postgres"
    password="....." maxActive="20" maxIdle="10"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
   maxWait="-1"/>
</Context>
于 2012-01-06T18:47:11.337 に答える
3

今日、私は同様の問題に対処するために半日を費やしました。次のようなコンテキストを定義する tomcat server.xml ファイルがあります。

<Context docBase="app" path="/my_context_path">
</Context>

次に、org.apache.tomcat.jdbc.pool.DataSource を使用して jdbc プールのサポートを追加しようとしました。

リソース定義を server.xml コンテキスト定義に追加しました (上記を参照)。もちろん、web.xml で resource-ref を定義しました。

しかし、常に org.apache.tomcat.dbcp.dbcp.BasicDataSource が返されました。Tomcatのデバッグに時間を費やし、最終的に次のようになりました。

  1. server.xml コンテキストでリソースを定義すると、Tomcat はそれを取得しません。
  2. Web アーカイブの META-INF/context.xml で定義すると、問題なく動作します。
  3. server.xml GlobalNamingResources タグで定義されている場合、Tomcat はそれを取得しません。
  4. Tomcat グローバル context.xml ファイルで定義すると、問題なく動作します。

悪いケース 1、3 で web.xml に resource-ref を指定すると、Tomcat は org.apache.tomcat.dbcp.dbcp.BasicDataSource を返します。これは、何らかのデフォルトであることがわかります。しかし、返されたそのようなデータ ソースを使用すると、次のような問題が発生

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

します。web.xml で resource-ref を指定しないと、そのような名前のリソースが見つからないという例外が発生します。

また、良いケース 2,4 では、web.xml で resource-ref を指定する必要がないことに気付きました (resource-ref の有無にかかわらず動作します)。

私が説明したいくつかのケースを試してみてください。何かが役立つことを願っています。

tomcat グローバル context.xml ファイルでリソースを定義しようとします。

幸運を!

Ps 7.0.22 バージョンも実行しています。

于 2011-11-16T16:08:28.160 に答える
-1

解決策は、type="javax.sql.DataSource" の context.xml でリソースを定義するときに、サーブレットに javax.sql.DataSource をインポートすることです。

于 2015-01-16T07:46:31.480 に答える