Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблема с закрытием потоков


(Roy Obenon) #1
import java.sql.SQLException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ConnectToMSSQL extends ConnectToSQL implements Runnable {

public ConnectToMSSQL(String db_connect, String db_login, String db_password) {
    super(db_connect, db_login, db_password);
}

public static void main(String[] args) {
    ExecutorService executorService = Executors.newCachedThreadPool();
           try {
                for (int i = 1; i <= 30; i++) {
                    System.out.println(executorService.toString());
                    executorService.submit(new ConnectToMSSQL("jdbc:sqlserver://localhost", "user", "password"));
                }
                executorService.shutdown();
                System.out.println(executorService.toString());

            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    @Override
    public void run() {
          try {
                 dbSelect("select * from testt.dbo.sfp_1CAppServ_counters");   // метод реализован в ConnectToSQL
          } catch (SQLException e){
                e.printStackTrace();
          }
    }
}

Идея в том, чтобы создать 30 подкл. к БД (т.е. создались 30 потоков, потом закрылись)
В моей реализации закрывается только последний


(Sergey Korol) #2

Мой вам совет - использовать для таких целей готовые библиотеки или фреймворки по типу Hibernate + c3p0 / Spring, которые умеют адекватно менеджить сессии, работать с пулом конекшенов, конкаренси и т.п.


(Aleksey) #3

а что у вас внутри ConnectToSQL#dbSelect()?
Вот там коннешн должен же и закрываться после выполнения селекта, используйте try-with-resources во избежания проблем с закрытием любых ресурсов и будет вам счастье (если Java 7+)


(Roy Obenon) #4
public void dbSelect(String queryText) throws SQLException{

        ResultSet rs = null;
        Statement statement = null;
        Connection connection = null;
        ResultSetMetaData rsm;
        try {
            connection = DriverManager.getConnection(db_connect_string, db_login, db_password);
            statement = connection.createStatement();
            rs = statement.executeQuery(queryText);
            rsm = rs.getMetaData();
            int columns = rsm.getColumnCount();
            for (int i = 1; i <= columns; i++){
                System.out.printf("%-8s\t", rsm.getColumnName(i));
            }
            System.out.println();
            while (rs.next()) {
                for (int i = 1; i <=columns; i++)
                    System.out.printf("%-8s\t", rs.getObject(i));
                System.out.println();
            }
        }finally {
            rs.close();
            statement.close();
            connection.close();
        }
    }