当前位置: 首页 > 面试题库 >

为什么java.sql.DriverManager.getConnection(...)挂起?

沈子实
2023-03-14
问题内容

我正在尝试与大学的MySQL数据库建立连接,但该连接已挂起。

import java.sql.*;

public class ConnectToDB {
        public static void main(String args[]){
                try {
                        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
                        String url = "jdbc:mysql://db.cs.myUniversity.com/dbName"; 
                        System.out.println("BEFORE"); 
                        Connection con = DriverManager.getConnection(url,"me", "password");
                        System.out.println("AFTER");
                        ...

调用time java ConnectToDB打印(在我最终杀死它之后):

Copyright 2004, R.G.Baldwin
BEFORE
AFTER

real    3m9.343s
user    0m0.316s
sys     0m0.027s

我刚刚从下载的MySQL连接器/ J
这里。我不确定这是否是问题的一部分。我非常准确地遵循了指示。

我也可以像这样在命令行上连接到mysql:

$ mysql -u me -h db.cs.myUniversity.com -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 882328
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use dbName;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW tables;
+-------------------+
| Tables_in_dbName  |
+-------------------+
| classics          | 
+-------------------+
1 row in set (0.00 sec)

可能的问题:

  • 我写的Java代码
  • 我如何安装MySQL Connector / J
  • 某种网络问题阻止了连接

问题: 我应该怎么解决这个问题?为什么getConnection呼叫挂了?

我正在关注本教程


问题答案:

您提供的输出没有帮助。

我看到在打印之前和之后,所以建立了连接。该代码未显示这些计时包含的内容,因此我无法确定它们的含义。

如果您建议由于从未建立连接而不得不终止代码,则可能是因为您的用户名,密码和客户端IP尚未获得所需的授予权限。

可能:

  1. 您的大学网络;寻找网络工程师询问防火墙。
  2. MySQL数据库中的权限;找到DBA并询问。
  3. 您的代码;您发布的信息不足。发布全班。

那版权是怎么回事?我会失去的。

此代码有效。对其进行修改,以使相关参数符合您的问题。(我的数据库使用MySQL
5.1.51和一个名为Party的表。)当我在本地计算机上运行它时,挂断时间为641 ms。

package persistence;

import java.sql.*;
import java.util.*;

/**
 * DatabaseUtils
 * User: Michael
 * Date: Aug 17, 2010
 * Time: 7:58:02 PM
 */
public class DatabaseUtils
{
/*
    private static final String DEFAULT_DRIVER = "org.postgresql.Driver";
    private static final String DEFAULT_URL = "jdbc:postgresql://localhost:5432/party";
    private static final String DEFAULT_USERNAME = "pgsuper";
    private static final String DEFAULT_PASSWORD = "pgsuper";
*/
    private static final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DEFAULT_URL = "jdbc:mysql://localhost:3306/party";
    private static final String DEFAULT_USERNAME = "party";
    private static final String DEFAULT_PASSWORD = "party";

    public static void main(String[] args)
    {
        long begTime = System.currentTimeMillis();

        String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER);
        String url = ((args.length > 1) ? args[1] : DEFAULT_URL);
        String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME);
        String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD);

        Connection connection = null;

        try
        {
            connection = createConnection(driver, url, username, password);
            DatabaseMetaData meta = connection.getMetaData();
            System.out.println(meta.getDatabaseProductName());
            System.out.println(meta.getDatabaseProductVersion());

            String sqlQuery = "SELECT PERSON_ID, FIRST_NAME, LAST_NAME FROM PERSON ORDER BY LAST_NAME";
            System.out.println("before insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST));

            connection.setAutoCommit(false);
            String sqlUpdate = "INSERT INTO PERSON(FIRST_NAME, LAST_NAME) VALUES(?,?)";
            List parameters = Arrays.asList( "Foo", "Bar" );
            int numRowsUpdated = update(connection, sqlUpdate, parameters);
            connection.commit();

            System.out.println("# rows inserted: " + numRowsUpdated);
            System.out.println("after insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST));
        }
        catch (Exception e)
        {
            rollback(connection);
            e.printStackTrace();
        }
        finally
        {
            close(connection);
            long endTime = System.currentTimeMillis();
            System.out.println("wall time: " + (endTime - begTime) + " ms");
        }
    }

    public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException
    {
        Class.forName(driver);

        if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0))
        {
            return DriverManager.getConnection(url);
        }
        else
        {
            return DriverManager.getConnection(url, username, password);
        }
    }

    public static void close(Connection connection)
    {
        try
        {
            if (connection != null)
            {
                connection.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }


    public static void close(Statement st)
    {
        try
        {
            if (st != null)
            {
                st.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet rs)
    {
        try
        {
            if (rs != null)
            {
                rs.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static void rollback(Connection connection)
    {
        try
        {
            if (connection != null)
            {
                connection.rollback();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static List<Map<String, Object>> map(ResultSet rs) throws SQLException
    {
        List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();

        try
        {
            if (rs != null)
            {
                ResultSetMetaData meta = rs.getMetaData();
                int numColumns = meta.getColumnCount();
                while (rs.next())
                {
                    Map<String, Object> row = new HashMap<String, Object>();
                    for (int i = 1; i <= numColumns; ++i)
                    {
                        String name = meta.getColumnName(i);
                        Object value = rs.getObject(i);
                        row.put(name, value);
                    }
                    results.add(row);
                }
            }
        }
        finally
        {
            close(rs);
        }

        return results;
    }

    public static List<Map<String, Object>> query(Connection connection, String sql, List<Object> parameters) throws SQLException
    {
        List<Map<String, Object>> results = null;

        PreparedStatement ps = null;
        ResultSet rs = null;

        try
        {
            ps = connection.prepareStatement(sql);

            int i = 0;
            for (Object parameter : parameters)
            {
                ps.setObject(++i, parameter);
            }

            rs = ps.executeQuery();
            results = map(rs);
        }
        finally
        {
            close(rs);
            close(ps);
        }

        return results;
    }

    public static int update(Connection connection, String sql, List<Object> parameters) throws SQLException
    {
        int numRowsUpdated = 0;

        PreparedStatement ps = null;

        try
        {
            ps = connection.prepareStatement(sql);

            int i = 0;
            for (Object parameter : parameters)
            {
                ps.setObject(++i, parameter);
            }

            numRowsUpdated = ps.executeUpdate();
        }
        finally
        {
            close(ps);
        }

        return numRowsUpdated;
    }
}


 类似资料:
  • 问题内容: 我可以成功运行容器: 但是执行挂起: 直到我按任意键,例如: 为什么挂? 更新 : 阅读评论后,我想我会得到答案: 先决条件: “ docker attach”重用相同的tty,而不打开新的tty。 (1)执行无守护程序模式: 一切正常,然后运行命令: (2)在守护程序模式下运行: 实际上, 以下内容应该已经从正在运行的容器输出到stdout: 因此执行似乎挂起,但实际上它正在等待您的

  • 问题内容: 由于ES6类仅仅是 avaScript现有的基于原型的继承 的 _语法[[1]],因此(IMO)可以合理地定义它: 但是以下操作无效: 为什么不悬挂ES6类? 问题答案: 为什么不悬挂ES6类? 其实他们 _都_悬挂(变量绑定在整个范围内都有效),就像和是他们只未初始化。 提升其定义很有意义 不。在定义类之前使用类绝不是一个好主意。考虑例子 比较一下 如您所料,这会引发错误。这是静态属

  • 我正在尝试使用Firebase身份验证实现Apple登录。我正在遵循Firebase/快速入门-android示例。 我的登录片段会覆盖,以检查任何挂起的结果: 以及启动登录流程的按钮: viewModel从存储库调用以下方法: 官方手册规定: 使用此方法登录会将您的活动置于后台,这意味着系统可以在登录流程中回收活动。 所以我开始测试挂起的结果,方法是在Android Studio中终止应用程序,

  • 我已经写了一个玩具应用程序来尝试通过sqlx使用Postgresql。我有一个大容量插入器 作为准备好的陈述的内容 然后,我将继续向正在创建的体量插入添加行。 然后最后执行准备好的语句 这以前工作得很好,但是现在我又回到了它,试着执行这个代码,它挂在 我是否在代码中遗漏了什么,或者这一切都与数据库引擎有关,没有响应。 这是我的完整代码。 如果有帮助的话,我也可以包括contacts.json文件的

  • 问题内容: 想要改善此职位? 提供有关此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我在Arch Linux,i7-5930k 6核心CPU和64GB DDR4 RAM上运行,并且正在使用IntelliJ IDEA 14。 几天前,IDEA对我来说还算不错,但是有一天,突然间,它在“索引”阶段打开项目后就开始挂起。我没有更新IDEA,并且我的项目没有

  • 我正在完成下面的Clojure教程。我刚刚安装了Emacs和Leiningen。如果单独调用,两者都可以工作。但是,当我试图调用时,如本教程所述: 使用Emacs打开文件clojure noob/src/clojure_noob/core。clj,您在第1章中创建的。接下来,使用M-x苹果酒插孔。这将启动REPL并创建一个新的缓冲区,您可以在其中与之交互。 在最后一条消息后将永远挂起: 我做错了什