質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

Java(サーブレット/JSP)で、Oracleデータベースに接続できません

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,146

score 5

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Servlet25")
public class Servlet25 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String msg;
        try {
              Class.forName("oracle.jdbc.driver.OracleDriver");
              msg = "ドライバのロードに成功しました<br>";

            }catch (ClassNotFoundException e){
                msg = "ドライバのロードに失敗しました<br>";
                e.printStackTrace();
            }catch (Exception e){
                msg = "ドライバのロードに失敗しました2<br>";
            }
        System.out.println("aaa");
        System.out.println(msg);
        request.setAttribute("msg", msg);

        Connection conn = null;
        final String url = "jdbc:oracle://192.168.11.12:1521:ORCL";
        final String user = "test";
        final String password = "test8128617";
        String err = "";

        try {
            conn = DriverManager.getConnection(url, user, password);

        } catch (final SQLException e) {
            err = "データベースの接続に失敗しました。";
            e.printStackTrace();
        }
        request.setAttribute("err", err);

        String view = "WEB-INF/view/index.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(view);

        dispatcher.forward(request, response);
    }

}

e.printStackTrace()によるエラーを見ると、「ドライバのロードに成功しました<br>java.sql.SQLException: 無効なOracle URLが指定されました。」と表示されるため、JDBCドライバは正常にロードできているようです。
指定したデータベースのURLはおそらく正しいと思われるので原因がわからず困っている状態です。

データベースは起動しています。
JavaはEclipseで行っています。
OSはwindows10 Proです。

コンソール画面

ドライバのロードに成功しました<br>java.sql.SQLException: 無効なOracle URLが指定されました。

    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:447)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at test.controller.testServlet.doGet(testServlet.java:53)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)

公式サイト内のページから「Oracle Database 12c Release 1 (12.1.0.2) drivers」を選択し、このページから最上部の「Oracle Database 12.1.0.2 JDBC Driver & UCP Downloads」のJDBCドライバ(ojdbc-full.tar.gz)をダウンロードしました。
上記のJDBCドライバはthinドライバと書かれているのでthinドライバだと思われます。
データベースのバージョンは「11.2.0.2.0」なので、上記のドライバと対応しているようです(公式サイト)。
解凍して、「odjbc6.jar」「odjbc7.jar」「xdb6.jar」の3つを・・WebContent/WEB-INF/libに置きました。3つも置いたのは適切なjarファイルがどれなのか判断できなかったからです。
ただ公式サイトをよく見ると「odjbc6.jar」が対応しているようです。
また、解凍した中にまだ未使用のjarファイルが残っています(orai18n.jarとsimplefan.jar)。

また、以下のことも試しましたがだめでした。
final String url = "jdbc:oracle://192.168.11.12:1521:ORCLを以下に変更
final String url =  "jdbc:oracle:thin://192.168.11.12:1521:ORCL"

URLの指定に「thin:」を追加した後のコンソール画面

ドライバのロードに成功しました<br>
java.sql.SQLRecoverableException: IOエラー: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:743)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:662)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:560)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at test.controller.testServlet.doGet(testServlet.java:53)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:470)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:506)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:595)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:230)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1452)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496)
    ... 30 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.base/java.net.PlainSocketImpl.waitForConnect(Native Method)
    at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:609)
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:161)
    at oracle.net.nt.ConnOption.connect(ConnOption.java:159)
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:428)
    ... 35 more

修正部分(URLの指定)※接続成功した書き方

修正後

final String url = "jdbc:oracle:thin:@192.168.11.12:1521:xe";
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • vjusr

    2020/02/20 10:09

    おそらくサポート契約はしてないです。
    プログラムではなく、利用環境やOracleデータベースの設定が原因になっている可能性が高いのでしょうか。
    先程気づいたんですが、URLに「thin:」を付けたことでコンソールのエラーログが変わり、「java.sql.SQLRecoverableException: IOエラー: The Network Adapter could not establish the connection」というエラーに変わったようです。

    キャンセル

  • Orlofsky

    2020/02/20 13:38

    エラーメッセージでググって解決しなければ、オラクル・サポートに問い合せます。

    サポート契約することを拒否して破綻したシステムを何社も見聞きしています。頑張ってください。

    個人的には ORA-600などオラクル・サポートにアラート・ログ、トレース・ファイル、ダンプファイル、インシデントファイル
    などを送って調べてもらわないと解決しないエラーが起きてもオラクル・サポートに問い合せできないが、自分たちで解決するように押し付けられそうになって断ったこともあります。爆笑

    キャンセル

  • vjusr

    2020/02/21 10:15

    開発者のOracleでなければ解決できないようなエラーも起こるんですね。
    私はデータベースもJavaも初学者なので今回は本当に何が何やらといった感じでした。
    今回は学習目的の開発でしたが、本格的にデータベースの運用をするときはサポート契約も視野に入れたいと思います。

    キャンセル

回答 2

checkベストアンサー

+1

無効なOracle URLが指定されました。

このエラーが出ている時点でurlが正しくはありません。

oci thin 等適切なドライバタイプの指定が必須ですがありません。

oracle jdbc driverのマニュアルにあるのでつなぎたい方式のurlに変えてください

JDBC URL

thin ドライバと判明したので追記

- final String url =  "jdbc:oracle:thin://192.168.11.12:1521:ORCL";
+ final String url =  "jdbc:oracle:thin://192.168.11.12:1521/ORCL";

とかは

まさかとはおもうが・・・

- final String url =  "jdbc:oracle:thin://192.168.11.12:1521/ORCL";
+ final String url =  "jdbc:oracle:thin://192.168.11.12:1521/XE";

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/20 10:07

    そうなんですね。
    oracleのバージョンは「11.2.0.2.0」ですが、他の情報はよくわかりません。
    先程気づいたんですが、「thin:」を付けたことでコンソールのエラーログが変わり、「java.sql.SQLRecoverableException: IOエラー: The Network Adapter could not establish the connection」というエラーに変わったようです。

    キャンセル

  • 2020/02/20 13:02

    IPかポート、またはその両方が間違えてるって出てる部分はこちらではオラクルの設定を確認して、設定しろとしかいいようがないよ

    キャンセル

  • 2020/02/21 10:16

    何とか解決しました。
    お騒がせしました。
    //が不要で、@が足りなかったようです。
    修正前の@なしのURLの書き方でも接続できているという記事がたくさんあったこともあり、徹底して調査しきれていなかったので反省しています。
    thinやxeの指定も必須でしたので、@も含めた3点が不足していたということがわかりました。

    キャンセル

+1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/20 12:34

    了解です。
    OSの情報を修正しました。

    キャンセル

  • 2020/02/20 12:45

    https://www.oracle.com/jp/system-requirement/interoperability-support-195844-ja.html
    Database がOracle11.2.0 なら Oracle Clientが12.2.0 でも接続できると書いてあるので、他に手段がなければそちらで試してみては?

    キャンセル

  • 2020/02/20 12:58

    事情がありOracle Clientは使わず直接接続でやるという制約があるので、Oracle Clientは使えないと思われます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る