在Java应用程序中打开和返回数据库连接的最佳方法?

时间:2015-12-28 03:58:06

标签: java database jdbc

我提出了以下实用程序类:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySqlConnection
{
    private static String dbUrl = "jdbc:mysql://localhost:3306/database";
    private static String dbUsername = "root";
    private static String dbPassword = "mysql";

    public static Connection getConnection()
    {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
        } catch (ClassNotFoundException e) {
            System.out.println("Could not load JDBC driver: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("Could not connect to DB: " + e.getMessage());
        }
        return connection;
    }
}

问题是:我不想从我的方法返回 null ,因为通过这样做我强制我的调用者每次都进行if (connection != null) {...}检查他们打开并希望使用连接的时间。我发现这些空检查容易出错,并且不惜一切代价避免它们。我可以遵循哪种方法来管理我的应用程序中的数据库连接?

3 个答案:

答案 0 :(得分:5)

首先,从JDBC 4.0 / Java 6开始,不再需要调用Class.forName()
See is Class.forName() necessary

接下来,不要埋没异常。将它们扔到堆栈中,让调用者决定应该如何处理异常。根据调用getConnection()的时间,您可能希望:

  • 向用户显示错误弹出框
  • 尝试使用其他数据库进行连接
  • 运行脚本以尝试检查数据库的状态,并尝试重新启动它,如果它似乎已关闭
  • 完全重试getConnection()

我的观点是,不要害怕将异常抛出堆栈并让调用者适当地处理异常。

尽管如此,您的getConnection()方法应该只需要存储您的数据库URL,用户名和密码。

public class MySqlConnection
{
    private static String dbUrl = "jdbc:mysql://localhost:3306/database";
    private static String dbUsername = "root";
    private static String dbPassword = "mysql";

    public static Connection getConnection() throws SQLException
    {
        return DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
    }
}

实际上,getConnection()很少会抛出SQLException。我曾经看到它抛出SQLException的唯一情况是因为凭据不正确或数据库已关闭。

答案 1 :(得分:1)

您可以在原始代码中向上抛出异常,然后每次想要获得连接时都必须处理可能的异常。当然,你不会有空问题,但最终可能会有更多的工作。但是,它确实使得必须处理连接不起作用非常明确,这可能比简单地返回null更清楚。

答案 2 :(得分:1)

请参阅这两个问题,Should a retrieval method return 'null' or throw an exception when it can't produce the return value?How to show if a method may return null

应该清楚一点。

如果无法生成所需对象,则无法避免返回NULL(在某些情况下,我们可以选择返回EMPTY个对象,但这不适用于JDBC连接对象) - 您所能做的就是正确记录您的方法。

您还应该避免执行Sysouts并通过向您的方法添加throws并重新抛出异常来让调用者了解所期望的错误。在重新抛出之前,您可以选择将异常包装为更有用的(特定于您的应用程序)。

此外,从catch(NULL)返回显式return NULL;,而不是依赖于last return语句 - return connection;。如果不愿意吃饭Exception并继续下去,没有必要立即回来。

最后,您应该尝试使用@Null和@NotNull注释来正确记录您的方法。