从 Servlet 连接到 MySQL 不起作用 [重复]

Posted

技术标签:

【中文标题】从 Servlet 连接到 MySQL 不起作用 [重复]【英文标题】:Connection to MySQL from Servlet not working [duplicate] 【发布时间】:2017-06-19 12:19:06 【问题描述】:

我正在制作一个小型应用程序,这样我就可以将课堂上的笔记发布到服务器上。我在数据库端使用 JDBC 和 mysql,在应用程序端使用 JSP/Servlet。

我编写了一个与我的 servlet 代码非常相似的独立 Java 应用程序,并且运行良好;我的 servlet 代码不能正常工作。

属性定义:

static final String DB_URL = "jdbc:mysql://localhost/DATASET";
static final String USER = "user";
static final String PASS = "pass";
Connection con = null;
Statement s = null;

doPost 方法:

    final String STATEMENT = "INSERT INTO FILE(upload_time, filename, class, data) VALUES(CURTIME(), '" + request.getParameter("file") + "', '" + request.getParameter("cls") + "', '" + request.getParameter("comm") + "')";
    final String STATEMENT2 = "INSERT INTO FILE(upload_time, filename, data) VALUES(CURTIME(), 'booga33.txt', 'ooga booga dooga22222222222222!')";

    try 
        con = DriverManager.getConnection(DB_URL, USER, PASS);
        s = con.createStatement();
        s.executeUpdate(STATEMENT2);
    
    catch(SQLException i)
    
        PrintWriter w = response.getWriter();
        w.println(i.getErrorCode());
    
    catch(Exception e)
    
        PrintWriter w = response.getWriter();
        w.println("error occured.");
    

它抛出一个SQLException 并给我一个错误代码0,这是一个无效的登录。用户名/密码正确,但我认为 URL 格式错误(尽管这正是我在 java 应用程序中使用的数据库 URL。另外,/DATASET 是我的架构的正确名称。

另外,我知道如果有很多用户使用我的实现会有问题;我只想让它与单个用户一起工作,然后我会担心很多。

编辑:我使用 tomcat 作为我的 JSP/Servlet 页面的网络服务器,我还将 mysql-connector 放置在我的项目 (Eclipse) 的引用库部分中。

非常感谢任何帮助!!!!

编辑:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/DATASET
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at DoSubmit.doPost(DoSubmit.java:38)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
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)

解决方案: 如果使用 Eclipse IDE,请将 MySQL 连接器 JAR 放入 WEB-INF->lib。 另外,在建立连接之前需要Class.forName(driver);

【问题讨论】:

尝试添加端口号:jdbc:mysql://:3306/DATASET 当您遇到异常时,您需要使用e.printStackTrace(); 打印出堆栈跟踪(它已写入标准输出,因此它会在tomcat 日志中的某个位置)。这将给您提供比“错误代码 0”或“发生错误”更好的错误消息。 我可能找到了问题所在。我从错误中得到消息,它指出“没有找到适合 jdbc:mysql://localhost:3306/DATASET 的驱动程序” @Feek 检查我的答案 @BalajiKrishnan 这是一个非常无用的建议,如果连接字符串中不包含端口,驱动程序已经默认为 3306。 【参考方案1】:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class Test 
    static final String DB_URL = "jdbc:mysql://localhost:3306/DATASET";
    static final String USER = "user";
    static final String PASS = "pass";
    static Connection con = null;
    static Statement s = null;
    public static void main(String[]args)
        final String query = "INSERT INTO FILE(upload_time, filename, data) VALUES(CURTIME(), 'booga33.txt', 'ooga booga dooga22222222222222!')";

        try 
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(DB_URL, USER, PASS);
            s = con.createStatement();
            //s.executeUpdate(query);
         catch (ClassNotFoundException | SQLException e) 
            e.printStackTrace();
        
    


【讨论】:

我试过这个。它对我不起作用,我的服务器也在 3306 上运行。 哦,可以打印异常日志吗?使用 e.printStackTrace(); 哦,明白了,你需要把合适的jdbc驱动mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.6点击下载jar并把它放到你的lib中,复制到你的lib后右键点击它并选择add to build路径。 我也看到需要放这个 Class.forName("com.mysql.jdbc.Driver");以上 con = DriverManager.getConnection(DB_URL, USER, PASS); @zillani 不,你不知道。很长一段时间以来都不需要这样做。【参考方案2】:

没有找到适合 jdbc:mysql://localhost:3306/DATASET 的驱动

首先将你的 JDBC 连接器放在你的类路径中,你可以下载它from here

如果您使用的是 maven,请使用:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.13</version>
</dependency>

第二确保您的连接信息正确:

public class CreateConnection 
    String driver = "com.mysql.jdbc.Driver";
    String DB_username = "root";
    String DB_password = "pass";
    String DB_URL = "jdbc:mysql://localhost:3306/DATABASE";

    public Connection getConnection() 
        try 
            Class.forName(driver);
            java.sql.Connection con = DriverManager.getConnection(DB_URL, DB_username, DB_password);
            return con;

         catch (ClassNotFoundException | SQLException e) 
            System.out.println("Exception " + e);
            return null;
        
    

我建议使用 Prepared Statement 代替你的方式,这是一种安全的练习方式,你可以在这里了解这个Prepared Statement

编辑

就像@Gimby 说的:确保你的 jar 放在正确的位置,所以如果你使用 Eclipse 使用 How to place a file on classpath in eclipse?,如果 Netbeans 使用 How to setup classpath in Netbeans?

【讨论】:

我已将 mysql-connector-java-5.1.40-bin.jar 放入我的类路径中。当我输入“Class.forName(...)”行时,出现“java.lang.ClassNotFoundException: com.mysql.jdbc.Driver”的启动错误,我不知道为什么。 尝试像@Feek一样使用我的课程 我正在使用您的课程,但我没有使用 maven。我仍然在 com.mysql.jdbc.Driver 上收到 classnotfoundexception ... 我觉得这将是一件非常愚蠢的事情,我正在搞砸。 @feek 它不起作用,因为在运行应用程序时它实际上不在类路径中。您构建和部署应用程序的方式一定有问题。更具体地说:mysql jar 应该以 WEB-INF/lib 结尾,但事实并非如此。 @Gimby 这就是问题所在。我正在观看独立 Java 应用程序的网络教程,他们在 Eclipse 中创建了自己的 lib 文件夹。当我把它放在那里时,它可以正常工作。谢谢!【参考方案3】:
//Add MySQL jdbc jar file into project lib.

public static Connection con; 
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Database name", userid,password); 

【讨论】:

请详细说明您的答案,以帮助提问者了解您的答案有何帮助。 欢迎来到堆栈溢出 :-) 请看How to Answer。您应该提供一些信息为什么您的代码可以解决问题。纯代码答案对社区没有用处。 欢迎来到 Stack Overflow!虽然您可能已经解决了这个用户的问题,但纯代码的答案对于将来遇到这个问题的用户来说并不是很有帮助。请编辑您的答案以解释为什么您的代码解决了原始问题。

以上是关于从 Servlet 连接到 MySQL 不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

[Docker]:将 PHPMyAdmin 连接到 MySQL 不起作用

从 EXCEL 连接到 SQL 数据库

Python MySql插入不起作用

JavaFX不会连接到MYSQL [重复]

Mysql 视图 - 自动增量不起作用(通过 Eloquent ORM)

如果 Layout 连接到父级,为啥动态调整大小不起作用?