java - 无法使用 @Resource 使用 Oracle 和 Java 创建类错误的 JDBC 驱动程序

标签 java tomcat jdbc

温习我的 Java 技能伙计们。我曾经在类中的 Java 中声明我的连接详细信息。这次我决定尝试使用 context 和 @Resource 方法,但出现了一些错误

INFO: Server startup in 1701 ms java.sql.SQLException: Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver' for connect URL 'jdbc:oracle:thin@//10.30.30.30:1521/mydatabase?useSSL=false' at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2065) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1939) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412) at com.pldt.itms.FirstServlet.doGet(FirstServlet.java:40) at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) Caused by: java.sql.SQLException: No suitable driver at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2056) ... 27 more

下面是我在 WebContent/META-INF 中的 context.xml

<?xml version="1.0"?>
<Context>

<Resource url="jdbc:oracle:thin@//10.30.30.30:1521/mydatabase?useSSL=false" driverClassName="oracle.jdbc.driver.OracleDriver" password="password" username="username" maxWait="10000" maxIdle="5" maxActive="20" type="javax.sql.DataSource" auth="Container" name="jdbc/web_my_context"/>

</Context>

这是我的 Java 类

package com.company.project;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Resource(name="jdbc/web_my_context")
    DataSource dataSource;
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1 printwriter
        PrintWriter out = response.getWriter();
        response.setContentType("text/plain");
        //2 connect to db
        Connection myConn = null;
        Statement myStmt = null;
        ResultSet myRs = null;

        try{
            myConn = dataSource.getConnection();

        //3 create sql
            String sql = "select * from table_authorities";
            myStmt = myConn.createStatement();
        //4 execute sql
            myRs = myStmt.executeQuery(sql);
        //5 process resultset of sql statment

            while (myRs.next()){
                String email = myRs.getString("username");
                out.println(email);
            }

        } catch (Exception exc) {
            exc.printStackTrace();
        }
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

}

enter image description here

编辑: 我更正了我的 xml

<?xml version="1.0"?>

<Context>

<Resource url="jdbc:oracle:thin:@//10.30.30.30:1521/mydatabase?useSSL=false" driverClassName="oracle.jdbc.driver.OracleDriver" password="password" username="username" maxWait="10000" maxIdle="5" maxActive="20" type="javax.sql.DataSource" auth="Container" name="jdbc/web_my_context"/>

</Context>

但是现在还是报错:

Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:272) at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263) at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486) ... 35 more

最佳答案

正如其他人所指出的,您的 xml 中存在语法错误,正确的语法是

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

我认为您只是在 Oracle 和 MySQL 之间切换时出现拼写错误,我建议您在发布问题时不要这样做,以便我们可以准确地帮助您,为此我们需要最新的语法。

更新的答案

我认为导致您错误的实际上是这里的这一行

'jdbc:oracle:thin@//10.30.30.30:1521/mydatabase?useSSL=false'

AFAIK useSSL=false 仅适用于 MySQL 而不适用于 Oracle 数据库。

尝试在您的 xml 中删除 useSSL=false。您的代码现在应该如下所示

'jdbc:oracle:thin@//10.30.30.30:1521/mydatabase'

我相信默认情况下 Oracle 不使用 SSL,您不再需要明确地说它不使用 SSL。以防万一你想为 Oracle 使用 SSL 你将不得不使用 tcps 协议(protocol),你可以通过使用像这样的详细的 TNS 样式来做到这一点。

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcps)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))

如果您有兴趣配置您的 Oracle 连接以使用 SSL,您可以查看他们的 documentation over at this LINK .

关于java - 无法使用 @Resource 使用 Oracle 和 Java 创建类错误的 JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42339681/

相关文章:

java - net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc:::4.0.4 意外标记:DAY

tomcat - 将 CORS 过滤器应用于 Tomcat 4XX 响应

java - 遍历数据库结果集

java - XML解析: MismatchedInputException: Cannot construct instance of `A` (although at least one Creator exists)

java - 使用 Smack 4.1 的 XMPP 客户端在登录期间给出 NullPointerException

java - Servlet Listners 和加载外部 Jars 性能

服务器离线时 session 持久性 Hazelcast 客户端初始化

java - GemfireXD - String(VARCHAR) 数组的PreparedStatement setArray 不起作用

java - 是否可以在服务器上解码从客户端作为字节数组发送的字节?

javascript - 如何将对象从一个 JSP 传递到另一个 JSP?