Это правильная реализация соединения с базой данных и автозаполняемых ресурсов? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть программа, которая читает из таблицы базы данных MySQL, выполняет итерацию по resultSet и возвращает данные строки для определенного userId в списке. С помощью всех доступных интернет-ресурсов мне удалось создать что-то, что работает, но я не уверен, правильна ли моя реализация или нет. Ниже приведены мои классы DbConnection и DaoImpl.

DbConnection.java

    /**
 * This class is responsible for creating a new database connection using the declared URL, USER and PASSWORD.
 */

package dbconnection;

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

public class DbConnection implements AutoCloseable {
    public static final String DB_URL = "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false";
    public static final String USER = "root";
    public static final String PWD = "root";

    private Connection conn;

    /**
     * An empty constructor that takes no arguments and creates a new Connection using DriverManager.getConnection.
     * The connection is initiated inside a try-with resources with SQLException catch.
     */

    public DbConnection() {
        try {
            conn = DriverManager.getConnection(DB_URL, USER, PWD);
            System.out.println("Connection Established.");
        } catch (SQLException e) {
            System.out.println("Couldn't Connect!! " + e.getMessage());
        }
    }


    //Return the current connection
    public Connection getConn() {
        return conn;
    }


    //close
    public void close() {
        try {
            if (conn != null) {
                conn.close();
                System.out.println("Connection Closed");
            }
        } catch (SQLException e) {
            System.out.println("Couldn't close Connection " + e.getMessage());
        }

    }
}

TiedostoDaoImpl.java

 import dbconnection.DbConnection;
import pojos.Tiedosto;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TiedostoDaoImpl implements TiedostoDAO {
    final String TABLE_TIEDOSTO = "tiedosto";
    final String COLUMN_TIEDOSTO_NAME = "nimi";
    final String COLUMN_TIEDOSTO_SIZE = "koko_tavua";
    final String COLUMN_TIEDOSTO_CONTENT = "sisalto";
    final String COLUMN_TIEDOSTO_CUSTOMER_ID = "hlo_id";
    final String COLUMN_TIEDOSTO_MINIOUPLOAD = "minioupload";

    final String QUERY_TIEDOSTO = "SELECT " + COLUMN_TIEDOSTO_NAME + ", " + COLUMN_TIEDOSTO_CUSTOMER_ID + ", " + COLUMN_TIEDOSTO_SIZE + ", " + COLUMN_TIEDOSTO_CONTENT +
            " FROM " + TABLE_TIEDOSTO + " WHERE " + COLUMN_TIEDOSTO_CUSTOMER_ID + " = ?";

    final String UPDATE_TIEDOSTO = "UPDATE " + TABLE_TIEDOSTO + " SET " + COLUMN_TIEDOSTO_MINIOUPLOAD + " = 1 WHERE " + COLUMN_TIEDOSTO_CUSTOMER_ID + " = ?";


    private DbConnection dbConnection = new DbConnection();
    private Connection databaseConnection;

    public TiedostoDaoImpl() {
        try {
            databaseConnection = dbConnection.getConn();
        } catch (Exception e) {
            System.out.println("Problem Connecting to Database! " + e.getMessage());
        }
    }


    //This method queries tiedosto table and returns the data as a List.
    @Override
    public List<Tiedosto> getDetails(int userId) throws SQLException {
        List<Tiedosto> files;
        try (PreparedStatement selectFromTiedosto = databaseConnection.prepareStatement(QUERY_TIEDOSTO)) {
            selectFromTiedosto.setInt(1, userId);
            try (ResultSet results = selectFromTiedosto.executeQuery()) {
                files = new ArrayList<>();
                while (results.next()) {
                    Tiedosto myFile = new Tiedosto();
                    myFile.setCustomerId(results.getInt(COLUMN_TIEDOSTO_CUSTOMER_ID));
                    myFile.setFileName(results.getString(COLUMN_TIEDOSTO_NAME));
                    myFile.setFileSize(results.getInt(COLUMN_TIEDOSTO_SIZE));
                    myFile.setContent(results.getBlob(COLUMN_TIEDOSTO_CONTENT));
                    files.add(myFile);
                }
            }
        }
        return files;
    }

когда я запускаю программу, я получаю вывод наподобие этого: enter image description here

Когда я запускаю программу, она говорит «Соединение установлено» и возвращает данные, но ничего не говорит о закрытии соединения. Мне нужно знать, правильно ли я реализую все это. Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 08 мая 2018

Вам нужно включить DbConnection в оператор try-with-resource, может быть что-то вроде ...

try (DbConnection db = new DbConnection(); PreparedStatement selectFromTiedosto = db.getConn().prepareStatement(QUERY_TIEDOSTO)) {
    // ...
} catch (SQLException ex) {
    e.printStackTrace();
}

Это автоматически закроет как DbConnection, так и PreparedStatement (хотя закрытие соединения в любом случае автоматически закроет PreparedStatement).

Недостаток: каждый раз, когда вы используете его таким образом, вы создаете новую Connection для базы данных, что может занять время. Вместо этого может быть предпочтительнее использовать отключаемый хук или пул соединений, в зависимости от того, что вы на самом деле делаете

...