打开和关闭数据库

时间:2016-04-18 14:23:37

标签: java mysql database jdbc

我正在处理一个记录我的服务器上的MySql数据库的应用程序。每次我想使用数据库,获取现有连接,如果没有,我认为是第一次。当我进行插入或选择时,效果很好,但是在进行咨询后,当它结束时,我永远无法重新获得连接而不会返回咨询。

我的数据库类

private Statement sment = null;
private PreparedStatement psment = null;
private ResultSet rset = null;
public boolean existsByNameAndUserId(String md5, int userId, int eventId) {
    Connection conn = Database.connect().get();
    try {
        psment = conn.prepareStatement("SELECT * FROM files "
                                        + "WHERE user_id = ? AND md5 = ? AND evento_id = ?");
        psment.setInt(1, userId);
        psment.setString(2, md5);
        psment.setInt(3, eventId);
        rset = psment.executeQuery();

        if (rset.next()) {
            return true;
        }
    } catch (Exception e) {

        e.printStackTrace();
    }

    return false;
}

private void close() {
    try { if (rset != null) rset.close(); } catch (Exception e) {System.out.println(e.getMessage());};
    try { if (psment != null) psment.close(); } catch (Exception e) {System.out.println(e.getMessage());};
    try { if (sment != null) sment.close(); } catch (Exception e) {System.out.println(e.getMessage());};
}

我提出以下函数:

String SQL_INSERT = "INSERT INTO files (evento_id, user_id, path, thumb, preview, width, height, md5, numero_corredor, created, modified) "
        + "VALUES (?,?,?,?,?,?,?,?,?,NOW(),NOW())";
public void save(List<components.File.Schema> files) throws SQLException {
    try (
            Connection conn = Database.connect().get();
            PreparedStatement statement = conn.prepareStatement(SQL_INSERT);
        ) {
            int i = 0;

            for (components.File.Schema file : files) {
                if(!existsByNameAndUserId(file.getMd5(), file.getUserId(), file.getEventId())){
                    statement.setInt(1, file.getEventId());
                    statement.setInt(2, file.getUserId());
                    statement.setString(3, file.getPath());
                    statement.setString(4, file.getPreview());
                    statement.setString(5, file.getThumb());

                    statement.setInt(6, file.getWidth());
                    statement.setInt(7, file.getHeight());
                    statement.setString(8, file.getMd5());
                    statement.setString(9, null);
                    statement.addBatch();
                    i++;
                    if (i % 1000 == 0 || i == files.size()) {
                        statement.executeBatch(); // Execute every 1000 items.
                    }
                }
            }
       }
}

接下来,我调用上面的函数来查找具有这些特征的记录,如果没有,我会进行插入。

{{1}}

1 个答案:

答案 0 :(得分:1)

您的问题是由于您将Connection conn = Database.connect().get()放在try-with-resources语句中,这是您应该做的事情,但它会关闭您的连接,当您再次将其作为方法{{ 1}}没有有效的测试,它不会创建新的连接。有效的测试是_connect(),实际上在您调用this._conn == null || !this._conn.isValid(0)的原始测试中,由于连接已关闭,因此将在我们的上下文中返回this._conn.isValid(0),因此它不会创建新的连接我们想要什么。

响应更新:问题的第二部分是,在保存false中,您调用method来关闭当前连接,您应该只关闭语句并让方法保存关闭连接。