我目前正在用Java制作一个服务器,作为数据库,我正在使用HikariCP (因为AFAIK是最好的库)。我尽量把它做好,所以我希望你们中的一些人能复习我的课程。
首先,DatabaseManager.java类:
package PKG.storage;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class DatabaseManager {
private final HikariDataSource _dataSource;
public DatabaseManager(String hostname, String username, String password, String database) {
HikariConfig databaseConfiguration = new HikariConfig();
databaseConfiguration.setMaximumPoolSize(20);
databaseConfiguration.setInitializationFailFast(true);
databaseConfiguration.setJdbcUrl("jdbc:mysql://" + hostname + ":3306/" + database);
databaseConfiguration.addDataSourceProperty("serverName", hostname);
databaseConfiguration.addDataSourceProperty("port", "3306");
databaseConfiguration.addDataSourceProperty("databaseName", database);
databaseConfiguration.addDataSourceProperty("user", username);
databaseConfiguration.addDataSourceProperty("password", password);
databaseConfiguration.addDataSourceProperty("dataSource.logger", "com.mysql.jdbc.log.StandardLogger");
databaseConfiguration.addDataSourceProperty("dataSource.logSlowQueries", "true");
databaseConfiguration.addDataSourceProperty("dataSource.dumpQueriesOnException", "true");
databaseConfiguration.setAutoCommit(true);
databaseConfiguration.setConnectionTimeout(3400L);
databaseConfiguration.setValidationTimeout(3399L);
databaseConfiguration.setLeakDetectionThreshold(5000L);
databaseConfiguration.setMaxLifetime(2874000L);
databaseConfiguration.setIdleTimeout(2874000L);
_dataSource = new HikariDataSource(databaseConfiguration);
}
public DatabaseQuery create() {
try {
return new DatabaseQuery(_dataSource.getConnection());
} catch (Exception ex) {
return null;
}
}
}这是我的DatabaseQuery.java文件:
package PKG.storage;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DatabaseQuery implements AutoCloseable {
private Connection _connection;
private PreparedStatement _stmt;
public DatabaseQuery(Connection connection) {
try {
_connection = connection;
} catch (Exception ex) {
//...
}
}
public void setQuery(String query) {
try {
_stmt = _connection.prepareStatement(query);
} catch (Exception ex) {
//...
}
}
public void setInt(int index, int i) {
try {
_stmt.setInt(index, i);
} catch (Exception ex) {
}
}
public void setString(int index, String i) {
try {
_stmt.setString(index, i);
} catch (Exception ex) {
}
}
public void setBoolean(int index, boolean i) {
try {
_stmt.setBoolean(index, i);
} catch (Exception ex) {
}
}
public void setDate(int index, Date i) {
try {
_stmt.setDate(index, i);
} catch (Exception ex) {
}
}
public void setDouble(int index, double i) {
try {
_stmt.setDouble(index, i);
} catch (Exception ex) {
}
}
public void execute() {
try {
_stmt.execute();
} catch (Exception ex) {
}
}
public int insert() {
try {
if (_stmt.execute()) {
return _stmt.getGeneratedKeys().getInt(1);
}
return -1;
} catch (Exception ex) {
return -1;
}
}
public ResultSet getResultSet() {
try {
return _stmt.executeQuery();
} catch (Exception ex) {
return null;
}
}
public String getString() {
try {
ResultSet set = getResultSet();
if (set != null && set.next()) {
return set.getString(0);
}
return null;
} catch (Exception ex) {
return null;
}
}
public int getInt() {
try {
ResultSet set = getResultSet();
if (set != null && set.next()) {
return set.getInt(1);
}
return -1;
} catch (Exception ex) {
return -1;
}
}
@Override
public void close() throws Exception {
_stmt.close();
_connection.close();
}
}我知道我有很多糟糕的异常处理(比如在调试模式中没有显示错误),但这将在稍后添加。我想得到一些评论,特别是关于DatabaseQuery类。
发布于 2017-06-24 19:29:32
您的代码主要由异常吞咽组成。说“以后再加.处理”不是借口。如果你认为不扔是好的,那么为什么所有的库都扔呢?
把它扔了。在异常情况下,永远不要返回-1。返回-1是模棱两可的,不能保证任何人都会检查它。只有在InputStream#read这样的性能关键的地方,它才能被接受,并且与所有正常的返回值明显不同。当已经有一个例外,那么它的性能成本已经支付了,所以坚持它。
它将由对文件的写入或行打印或两者兼而有之。
使用适当的记录器会好得多.但还是大错特错。您正在编写的是一种库代码,因为它应该在许多您还不知道的地方使用。在某些地方,-1或null将是一个有效的返回值,然后出现问题。无论如何,调试时会遇到问题,因为您的代码无法工作(可能是因为一个被遗忘的“异常返回值”检查),并且您必须在一些日志文件中查找这个问题。
如果这是一个好主意,java.util.sql会写一些有趣的消息到一些有趣的文件中,而不是抛出。
大多数情况下,正确的异常处理是不处理。就让它泡起来吧。声明异常,您就完成了。在主要方法附近的某个地方,你会知道该怎么做。然后,您将捕获它并执行一些有意义的操作,例如记录异常、向用户道歉、重试或终止。
如果您不喜欢代码中充斥了抛出子句,请将异常包装在某些YourRuntimeSqlException中。
https://codereview.stackexchange.com/questions/144120
复制相似问题