Невозможно создать драйвер JDB C класса '' для URL-адреса соединения 'null' Tomcat 9, Oracle 12 c, JDK 8, - PullRequest
1 голос
/ 15 февраля 2020

У меня есть простой веб-сервис, который пытается открыть соединение с базой данных.

Я использую jax-ws, Oracle 12 c DB, Tomcat 9, Java 8.

Может кто-нибудь опубликовать правильный способ сделать это?

Пока что я загрузил ojdbc7.jar и ucp.jar в каталог $ TOMCAT_HOME / lib.

  1. Что входит в applicationPath / META-INF / web. xml ?

Сейчас у меня есть следующее:

  <resource-ref>
    <res-ref-name>jdbc/UCPPool</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>
Что входит в TOMCAT_HOME / conf / server. xml?

Сейчас у меня есть следующее:

<context docbase="demods" path="/demods" reloadable="true">
  <Resource 
       name="jdbc/UCPPool"
       auth="Container"
       factory="oracle.ucp.jdbc.PoolDataSourceImpl"
       type="oracle.ucp.jdbc.PoolDataSource"
       description="Pas testing UCP Pool in Tomcat"
       connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"
       minPoolSize="2"
       maxPoolSize="5"
       inactiveConnectionTimeout="20"
       user="test"
       password="test"
       url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracleDB12c)(PORT=1563))(CONNECT_DATA=(SERVICE_NAME=PPS)))"
       connectionPoolName="UCPPool"
       validateConnectionOnBorrow="true"
       sqlForValidateConnection="select 1 from DUAL" />
 </context>

Что входит в TOMCAT_HOME / conf / context. xml?

У меня сейчас нет ничего в этом файле.

Здесь это код, который я использую для настройки соединения JDB C:

         Context ctx = new InitialContext();
         Context envContext = (Context) ctx.lookup("java:comp/env");
         DataSource ds  = (DataSource) envContext.lookup("jdbc/UCPPool");
         Connection conn = null;                         
         try {
             conn = ds.getConnection();
         }
         catch (SQLException e) { 
             return e.getMessage();
         }          

Сообщение, возвращаемое веб-службой:

"Cannot create JDBC driver of class '' for connect URL 'null'"

Что я делаю неправильно?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Хорошие новости, я смог заставить это работать сегодня в офисе.

Вот что я сделал:

  1. Я создал контекст. xml файл и поместил его в мой проект затмения внутри META-INF /. В META-INF / context. xml я поместил следующий код:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Context> 
<Resource 
        name="jdbc/orcljdbc_ds" 
        auth="Container"
        type="javax.sql.DataSource" 
        driverClassName="oracle.jdbc.OracleDriver"
        username="user1"
        password="password"
        url="jdbc:oracle:thin:@//myoracledb:1563/DEVSID"

/>
</Context>

Я ничего не помещал в контекст Tomcat. xml или файл server. xml, но Я думаю, что вы можете для разных сценариев ios (то есть общий источник данных с несколькими приложениями, запущенными на одном сервере приложений). Я также не поместил ничего в свой проект Eclipse WEB-INF \ web. xml.

Я использовал следующий код для проверки соединения:

package planAdminWS;

import javax.jws.WebMethod;
import javax.jws.WebService;

import java.io.PrintWriter;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;

@WebService
public class PlanAdminWS {

    @WebMethod
     public String createPlan(String EIN, String PN)
     {
        return "Creating Plan: " + EIN + "/" + PN;
     }

    @WebMethod
    public String updatePlan(String EIN, String PN) throws NamingException, SQLException {
        // Get a context for the JNDI look up
        DataSource ds = getDataSource();
        Connection conn = null;
        try {
            conn = ds.getConnection();
            if (conn != null) {
                Statement stmt = null;
                ResultSet rs = null;
                String query = "select * from V$version";
                stmt = conn.createStatement();
                rs = stmt.executeQuery(query);
                while (rs.next()) {
                    System.out.println(rs.getString(1));
                    return "Database Version : " + rs.getString(1);
                }
            } else {
                return "Conn is NULL";
            }

        } catch (SQLException e) {
            return e.getMessage();
        }

        return "Could not get DB Version";
    }

     /*
      * Method to create a datasource after the JNDI lookup
      */

      private DataSource getDataSource() throws NamingException {
        Context ctx;
        ctx = new InitialContext();
        Context envContext = (Context) ctx.lookup("java:/comp/env");
        // Look up a data source
        javax.sql.DataSource ds
              = (javax.sql.DataSource) envContext.lookup ("jdbc/orcljdbc_ds");
        return ds;
      }
}

это вернуло следующее в SoapUI:

"Версия базы данных: Oracle База данных 12 c Enterprise Edition, выпуск 12.1.0.2.0 - 64-разрядная версия"

Спасибо за помощь !!!

Вот еще один хороший ресурс: https://www.journaldev.com/2513/tomcat-datasource-jndi-example-java

0 голосов
/ 17 февраля 2020

Можете ли вы взглянуть на пример github и следовать ему, чтобы создать приложение Tomcat?

...