首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java HikariCP类

Java HikariCP类
EN

Code Review用户
提问于 2016-10-13 15:15:14
回答 1查看 290关注 0票数 1

我目前正在用Java制作一个服务器,作为数据库,我正在使用HikariCP (因为AFAIK是最好的库)。我尽量把它做好,所以我希望你们中的一些人能复习我的课程。

首先,DatabaseManager.java类:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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类。

EN

回答 1

Code Review用户

发布于 2017-06-24 19:29:32

您的代码主要由异常吞咽组成。说“以后再加.处理”不是借口。如果你认为不扔是好的,那么为什么所有的库都扔呢?

把它扔了。在异常情况下,永远不要返回-1。返回-1是模棱两可的,不能保证任何人都会检查它。只有在InputStream#read这样的性能关键的地方,它才能被接受,并且与所有正常的返回值明显不同。当已经有一个例外,那么它的性能成本已经支付了,所以坚持它。

它将由对文件的写入或行打印或两者兼而有之。

使用适当的记录器会好得多.但还是大错特错。您正在编写的是一种库代码,因为它应该在许多您还不知道的地方使用。在某些地方,-1null将是一个有效的返回值,然后出现问题。无论如何,调试时会遇到问题,因为您的代码无法工作(可能是因为一个被遗忘的“异常返回值”检查),并且您必须在一些日志文件中查找这个问题。

如果这是一个好主意,java.util.sql会写一些有趣的消息到一些有趣的文件中,而不是抛出。

大多数情况下,正确的异常处理是不处理。就让它泡起来吧。声明异常,您就完成了。在主要方法附近的某个地方,你会知道该怎么做。然后,您将捕获它并执行一些有意义的操作,例如记录异常、向用户道歉、重试或终止。

如果您不喜欢代码中充斥了抛出子句,请将异常包装在某些YourRuntimeSqlException中。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/144120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档