温习我的 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());
}
}
编辑: 我更正了我的 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/