在Java应用程序中打开和返回数据库连接的最佳方法?
我提出了以下实用程序类:
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) {...}
检查并想要使用连接。 我发现这些空检查容易出错,并且不惜一切代价避免它们。 我可以遵循哪种方法来管理我的应用程序中的数据库连接?
首先,从JDBC 4.0 / Java 6开始,不再需要调用Class.forName()
。
( 参见Class.forName()必要 )
接下来,不要埋没exception。 将它们扔到堆栈中,让调用者决定应该如何处理exception。 根据getConnection()
的调用时间,您可能希望:
- 向用户显示错误弹出框
- 尝试使用其他数据库进行连接
- 运行脚本以尝试检查数据库的状态,如果它似乎已关闭,则尝试重新启动它
- 完全重试getConnection()
我的观点是,不要害怕将exception抛出堆栈并让调用者适当地处理exception。
总而言之,您的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的情况是因为凭据不正确或数据库已关闭。
您可以向上抛出原始代码中的exception,然后每次想要获得连接时都必须处理可能的exception。 当然,你不会有空问题,但这最终可能会有更多的工作。 但是,它确实使得必须处理连接不起作用非常明确,这可能比简单地返回null更清楚。
请参考这两个问题, 检索方法是否应返回’null’或在无法产生返回值时抛出exception? 以及如何显示方法是否可以返回null
应该清楚一点。
如果无法生成所需的对象,则无法避免返回NULL
(在某些情况下,我们可以选择返回EMPTY
对象,但这不适用于JDBC连接对象) – 您所能做的就是正确记录方法。
您还应该避免执行Sysouts
并通过向方法添加throws
并重新抛出exception来让调用者了解所期望的错误。 在重新抛出之前,您可以选择将exception包装为更有用的(特定于您的应用程序)。
另外,从catch return NULL;
显式NULL
返回( return NULL;
)而不是依赖于last return语句 – return connection;
。 如果不愿意吃掉Exception
并继续下去,没有必要立即回来。
最后,您应该尝试使用@Null和@NotNull注释来正确记录您的方法。