【问题标题】:Connect to mysql database from servlet从 servlet 连接到 mysql 数据库
【发布时间】:2015-02-01 15:11:08
【问题描述】:

我正在尝试连接到我的数据库以检查用户名和密码。 我正在学习教程,但我的连接不起作用。我的问题是:

String url = "jdbc:mysql://localhost:3306/"; 
String dbName = "LoginExample";
String driver = "com.mysql.jdbc.Driver";  
String userName = "root";  
String password = "password"; 

所有这些值的含义是什么?那些是标准的吗?如果不是,我怎样才能找到哪些对应于我的数据库。此外,我在创建数据库时也没有被要求输入用户名和密码。

public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Login() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    public static boolean validate(String name, String pass) {
        boolean status = false;
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet rs = null;

        String url = "jdbc:mysql://localhost:3306/"; 
        String dbName = "LoginExample";
        String driver = "com.mysql.jdbc.Driver";  
        String userName = "root";  
        String password = ""; 

        try {  
            Class.forName(driver).newInstance();  
            conn = DriverManager  
                    .getConnection(url + dbName, userName, password);  

            pst = conn  
                    .prepareStatement("select * from Users where username=? and password=?");  
            pst.setString(1, name);  
            pst.setString(2, pass);  

            rs = pst.executeQuery();  
            status = rs.next();  

        } catch (Exception e) {  
            System.out.println(e);  
        } finally {  
            if (conn != null) {  
                try {  
                    conn.close();  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
            if (pst != null) {  
                try {  
                    pst.close();  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
            if (rs != null) {  
                try {  
                    rs.close();  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
        }
        return status;
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String un = request.getParameter("username");
        String pw = request.getParameter("password");

        response.setContentType("text/html");    
        PrintWriter out = response.getWriter();  

        HttpSession session = request.getSession(false);
        if (session != null) {
            session.setAttribute("name", un);
        }

        if (validate(un,pw)) {
            RequestDispatcher rd=request.getRequestDispatcher("welcome.jsp");    
            rd.forward(request,response); 
        } else {
            out.print("<p style=\"color:red\">Sorry username or password error</p>"); 
        }
    }

}

错误日志:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.ConnectException
MESSAGE: Connection refused: connect

STACKTRACE:

java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at servlets.Login.validate(Login.java:55)
    at servlets.Login.doPost(Login.java:112)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    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)


** END NESTED EXCEPTION **

【问题讨论】:

  • 没有代码很难找到问题。发布代码和堆栈跟踪。
  • "但是我的连接不工作" 你是什么意思?有什么错误/异常(如果有)?您如何在代码中使用这些变量来连接数据库?
  • 我认为 dbNameuserNamepassword 需要设置为您设置的值。

标签: java mysql servlets


【解决方案1】:

Url 告诉程序在哪里以及如何找到数据库。在这种情况下,您使用 JDBC 访问在您自己的计算机上运行的 MySQL 数据库 (localhost)。

dbname 是数据库的名称。 MySQL 服务器可能托管多个数据库,因此您需要指定您想要的数据库。

Driver 是用于访问数据库的 Java 类。

用户名和密码自行解释。

假设 url 中的端口和数据库名称是正确的,您的问题很可能是用户名/密码组合。默认情况下,用户名为“root”,密码为空。

【讨论】:

    【解决方案2】:

    是的,这些都是标准的,您必须使用它通过 java 连接到您的数据库。

        //since you have to connect to database you have to connect through to database server with url(where localhost signifies your current system and 3306 is a port)
        String url = "jdbc:mysql://localhost:3306/"; 
    
        //In order to connect to specific database specify its name
        String dbName = "LoginExample";
    
        //Initialize a driver so you can open a communications channel with the database.
        String driver = "com.mysql.jdbc.Driver"; 
    
        //credentials required to connect 
        String userName = "root";  
        String password = "password"
    

    由于您在安装过程中输入了任何用户名和密码,因此设置了默认名称和密码。默认用户名是root,密码是无密码。您也可以reset password

    com.mysql.jdbc.CommunicationsException:通信链接失败 由于潜在的异常:

    首先您不需要实例化驱动程序,只需将其称为静态初始化(例如,通过调用 Class.forName),以便在 DriverManager 中注册

    所以从Class.forName(driver).newInstance() 中删除.newInstance()

    同时检查端口3306是否被其他进程获取检查这个

    运行 resmon.exe 并转到网络选项卡以检查3306端口是否被其他进程获取。

    【讨论】:

    • 我查了,这个端口是mysql用的。我相信问题出在用户名和密码上。当我打电话给DriverManager.getConnection(url, userName, password); 时,我真的找不到解决问题的方法。我想我放弃了
    • @dres dont give up.Remove .newInstane() from Class.forName().newInstance() 然后检查确保你添加了 mysql-connector.jar
    • 我删除了newInstance,现在我得到了Access denied for user 'root'@'localhost' (using password: NO) 似乎密码不是空字符串。有没有办法找出root的密码是什么?
    • @dres 更新您的问题。无法直接检查用户名和密码,但您可以通过链接dev.mysql.com/doc/mysql-windows-excerpt/5.0/en/… 重置您的用户名和密码
    【解决方案3】:

    您不应该手动尝试从您的 servlet 建立数据库连接。相反,您应该定义一个 DataSource 并从您的 servlet 中查找它;

    tomcat 分步指南:

    1. 把你的mysql驱动放到tomcat的/lib文件夹中
    2. 在Tomcat的context.xml中定义一个数据源

      < Resource name="jdbc/DefaultDB"
            type="javax.sql.DataSource"  auth="Container"
            description="Default datasource"
            maxActive="100" maxIdle="30" maxWait="10000"
            username="" password="" 
            driverClassName="com.mysql.jdbc.Driver"
            url="com.mysql.jdbc.Driver"/>
      
    3. 在您的web.xml 中引用此数据源

      < resource-ref>  
              < res-ref-name>jdbc/DefaultDB</res-ref-name>  
              < res-type>javax.sql.DataSource</res-type>  
              < res-auth>Container</res-auth>  
      < /resource-ref >
      
    4. 查找数据源:

      InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DefaultDB");

      作为替代方案,您可以注入数据源:

      @Resource(name="jdbc/DefaultDB") private javax.sql.DataSource ds;

    5. 获取连接:

    Connection connection = ds.getConnection();

    【讨论】:

    • 我相信密码有问题,我不知道如何恢复它。我试图在 mysql 中创建一个新用户,但它不会让我
    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 2016-03-22
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多