powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache Commons DBCP, Swing покритикуйте код.
14 сообщений из 14, страница 1 из 1
Apache Commons DBCP, Swing покритикуйте код.
    #38952834
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
До определенного момента не задумывался о тонкостях соединений, думал уйду скоро из программирования вообще, но..
Написал часть некоторого приложения на Swing.
Blazkowicz очень здорово мне помог в одной из тем с таблице и с общими направлениями в целом :)
Возник вопрос о правильности использования DBCP и.. я бы хотел уточнить эту часть замечаний:

"2) Способ реализации getDBConnection у вас самый медленный. Подключите Apache Commons DBCP - примеров в инете навалом. И используйте получение соединения через DataSource.
3) В целом архитектура крайне не удачна и не продуманна.
Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например.
"
Начнем с 2) замечания, я скачал нужные библиотеки, прицепил их, нашел пример, переписал под себя и вот что вышло:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.dbcp2.cpdsadapter.DriverAdapterCPDS;
import org.apache.commons.dbcp2.datasources.SharedPoolDataSource;

public class DBConnectionPool {

    private static final String DB_DRIVER = "org.postgresql.Driver";
    private static final String DB_CONNECTION = "jdbc:postgresql://localhost:5432/gtm";
    private static final String DB_USER = "user";
    private static final String DB_PASSWORD = "12345";

    /**
     * Максимальное количество активных соединений, которые можно использовать
     * одновременно. -1 - неограниченное количество соединений
     */
    private static final int MAX_ACTIVE = 100;

    /**
     * Максимальное количество милисекунд, которые пул будед ждать (когда нет
     * свободных соединений) прежде, чем выбросить исключение. -1 - ожидание
     * будет длится неопределенное время
     */
    private static final int MAX_WAIT = 100;

    /**
     * Соедеинение с БД
     */
    private Connection conn = null;

    /**
     * Источник данных
     */
    private static DataSource ds = null;

    /**
     * Конструктор, определяет переменные для соединения с БД
     */
    public DBConnectionPool() {
        if (ds == null) {
            try {
                //Адаптер для JDBC-драйвера. Хранит параметры подключения к БД 
                DriverAdapterCPDS pcds = new DriverAdapterCPDS();
                pcds.setDriver(DB_DRIVER);
                pcds.setUrl(DB_CONNECTION);
                pcds.setUser(DB_USER);
                pcds.setPassword(DB_PASSWORD);

                //Реализация интерфейса DataSource для разделяемого пула соеднинений 
                SharedPoolDataSource tds = new SharedPoolDataSource();
                tds.setConnectionPoolDataSource(pcds);

                tds.setMaxTotal(MAX_ACTIVE);

                tds.setMaxConnLifetimeMillis(MAX_WAIT);

                ds = tds;

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

    /**
     * Возвращает соединение с БД
     */
    public Connection openConnection() throws SQLException {
        if (conn == null) {
            conn = ds.getConnection();
        }
        return conn;

    }

    /**
     * Возвращает количество активных соединений с БД
     *
     * @return количество активных соединений с БД
     */
    public static int getActiveConnection() {
        return ((SharedPoolDataSource) ds).getNumActive();
    }

    /**
     * Если соединение открыто, то возвращает соединение с DB
     */
    public Connection getConnection() throws SQLException {
        return openConnection();
    }

    /**
     * Закрыть соединение
     */
    public void close() {
        try {
            if (conn != null) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        DBConnectionPool pool = new DBConnectionPool();
        PreparedStatement pstmt = null;
        ResultSet rset = null;
        try {
            final Connection connection = pool.getConnection();
            pstmt = connection.prepareStatement("select visibleName from Users where enable is true");
            rset = pstmt.executeQuery();
            while (rset.next()) {
                final String name = rset.getString("visibleName");
                System.out.println("Пользователь: " + name);
            }
            System.out.println(connection);
            System.out.println(pstmt);
            System.out.println(rset);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (rset != null) {
                rset.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            //Обязательно возвращаем соединение в пул 
            pool.close();
        }

    }
}



Я не уверен, что правильно использую написанный пул, все вроде бы работает, по крайней мере, когда я в pgAdmin'e запускаю запрос:
select * from pg_stat_activity
он мне выдает ровно столько соединений, сколько на данный момент запущенно приложений.
Ну и плюс 3шт самого pgAdmin'а.
Использую я пул примерно вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
private final List<Users> usersList = new ArrayList<Users>();
private DBConnectionPool pool = new DBConnectionPool();
private Connection con = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;

 public Users[] getAllUsers() throws Exception {
        String sql = "select * from users";
        usersList.clear();
        try {
            con = pool.getConnection();
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                Users user = new Users();
                user.setId(rs.getInt("id"));
                user.setLogin(rs.getString("login"));
                usersList.add(user);
            }
            return usersList.toArray(new Users[0]);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            try {
                try (Connection con1 = con) {
                }
                try (PreparedStatement pstmt1 = pstmt) {
                }
                try (ResultSet rs1 = rs) {
                }
                try {
                    pool.close();
                } catch (Exception e) {
                }
            } catch (Exception ignore) {
            }
        }
        return null;
    }


В этом коде, меня смущает, что я 2 раза закрываю Connection:
Код: java
1.
try (Connection con1 = con) { }


в запросе в блоке finally и
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  public void close() {
        try {
            if (conn != null) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


в классе с пулом.


В замечании 3) сказано "Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например."
Я не совсем понял, что именно за модель, в каком виде должны хранится данные, предполагаю, что в виде массивов и/или коллекций или... ?
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38952867
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicвот что вышло:
Код: java
1.
public class DBConnectionPool


Большой бесполезный класс из которого нужен только метод создания DataSource. Всё остальное - мусор.



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        } finally {
            try {
                try (Connection con1 = con) {
                }
                try (PreparedStatement pstmt1 = pstmt) {
                }
                try (ResultSet rs1 = rs) {
                }
                try {
                    pool.close();
                } catch (Exception e) {
                }
            } catch (Exception ignore) {
            }
        }


Это какой-то феерический пушной зверек.
Что это? Зачем это?

Вот как может выглядеть метод
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            
try (Connection c = dataSource.getConnection) {
    try (PreparedStatement ps = c.prepareStatement("SELECT * FROM users")) {
        try (ResultSet rs = ps.executeQuery()) {
            while(rs.next()) {
                users.add(toUser(rs));
            }
        }
    }
}


Единственный его критический недостаток это проблема с включением в транзакцию.
Тут может помочь Spring JDBC. А ещё я бы порекомендовал обратить внимание на QueryDSL и jOOQ. Они примитивны, то возню с JDBC упрощают значительно. Хотя и обладают массой недостатков для больших проектов. Но для небольшого старта я бы использовал.


NixicВ замечании 3) сказано "Вам нужна промежуточная модель между Swing и базой данных. Туда нужно вычитать данные для отображения, чтобы быстро их читать из TableModel, например."
Я не совсем понял, что именно за модель, в каком виде должны хранится данные, предполагаю, что в виде массивов и/или коллекций или... ?

JTable читает данные из вашего наследника AbstractTableModel
AbstractTableModel читает данные из List<User>
А у вас в прошлом варианте он читал из ResultSet - этот вариант допустим, особенно если у вас огромная таблицы и вы хотите её грузить лениво. Но такое нужно редко. И пользы от такого решения, зачастую меньше чем вреда.
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38952889
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Nixic]До определенного момента не задумывался о тонкостях соединений, думал уйду скоро из программирования вообще, но..
...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
        try {
            con = pool.getConnection();
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                Users user = new Users();
                user.setId(rs.getInt("id"));
                user.setLogin(rs.getString("login"));
                usersList.add(user);
            }
            return usersList.toArray(new Users[0]);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            try {
                try (Connection con1 = con) {
                }
                try (PreparedStatement pstmt1 = pstmt) {
                }
                try (ResultSet rs1 = rs) {
                }
                try {
                    pool.close();
                } catch (Exception e) {
                }
            } catch (Exception ignore) {
            }




Ой! Зачем ЭТО?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    try (Connection con = pool.getConnection();
          PreparedStatement pstmt = con.prepareStatement(sql);
          ResultSet pstmt.executeQuery()) 
    {
            while (rs.next()) {
                Users user = new Users();
                user.setId(rs.getInt("id"));
                user.setLogin(rs.getString("login"));
                usersList.add(user);
            }
            return usersList.toArray(new Users[0]);
    }
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953351
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел пример тут по работе с spring-jdbc
Я правильно понимаю, что вся фишка именно в этой части кода примера:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
package com.javatalks.example.dao;
 
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
 
import javax.sql.DataSource;
 
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 
import ru.javatalks.example.model.Book;
import ru.javatalks.example.model.BookSearchCriteria;
 
public class BookDaoImpl implements BookDao {
 
	private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedTemplate;
 
    public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
		this.namedTemplate = new NamedParameterJdbcTemplate(dataSource);
	}
 
	private RowMapper<Book> rowMapper = new RowMapper<Book>() {
		@Override
		public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
			Book book = new Book();
			book.setId(rs.getInt("id"));
			book.setComment(rs.getString("comment"));
			book.setDateRelease(rs.getDate("date_release"));
			book.setTitle(rs.getString("title"));
			book.setAuthorId(rs.getInt("author_id"));
			return book;
		}
	};
 
	@Override
	public void insert(Book book) {
		String sql = "INSERT INTO book(title, comment, date_release, author_id, id) VALUES(?,?,?,?,?)";
		jdbcTemplate.update(sql, getPreparedStatementSetter(book));
	}
 
	@Override
	public void update(Book book) {
		String sql = "UPDATE book SET title=?, comment=?, date_release=?, author_id=? WHERE id=?";
		jdbcTemplate.update(sql, getPreparedStatementSetter(book));
	}
 
	@Override
	public void delete(Book book) {
		jdbcTemplate.update("DELETE FROM book WHERE id=?", book.getId());
	}
 
	@Override
	public Book getById(Integer id) {
		return jdbcTemplate.queryForObject("SELECT * FROM book WHERE id=?", rowMapper, id);
	}
 
	@Override
	public List<Book> getAll() {
		return jdbcTemplate.query("SELECT * FROM book", rowMapper);
	}
 
	@Override
	public List<Book> findByCriteria(BookSearchCriteria criteria) {
		if (criteria.isEmpty()) {
			return getAll();
		}
		String sql = "SELECT * FROM book WHERE true";
		if (criteria.getComment() != null) {
			sql += " AND comment=:comment";
		}
		if (criteria.getTitle() != null) {
			sql += " AND title=:title";
		}
		if (criteria.getMaxDateRelease() != null) {
			sql += " AND date_release<:maxDateRelease";
		}
		if (criteria.getMinDateRelease() != null) {
			sql += " AND date_release>:minDateRelease";
		}
		if (criteria.getAuthorId() != null) {
			sql += " AND author_id=:authorId";
		}
		BeanPropertySqlParameterSource namedParameters = new BeanPropertySqlParameterSource(criteria);
		return namedTemplate.query(sql, namedParameters, rowMapper);
	}
	
	private PreparedStatementSetter getPreparedStatementSetter(final Book book) {
		return new PreparedStatementSetter() {
			@Override
			public void setValues(PreparedStatement ps) throws SQLException {
				int i = 0;
				ps.setString(++i, book.getTitle());
				ps.setString(++i, book.getComment());
				ps.setDate(++i, new java.sql.Date(book.getDateRelease().getTime()));
				ps.setInt(++i, book.getAuthorId());
				ps.setInt(++i, book.getId());
			}
		};
	}
 
}


В частности в том, что не нужно заботиться о коннекте, пуле и очистке PreparedStatement, ResultSet ?


И еще, вот в примере же есть код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private RowMapper<Book> rowMapper = new RowMapper<Book>() {
		@Override
		public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
			Book book = new Book();
			book.setId(rs.getInt("id"));
			book.setComment(rs.getString("comment"));
			book.setDateRelease(rs.getDate("date_release"));
			book.setTitle(rs.getString("title"));
			book.setAuthorId(rs.getInt("author_id"));
			return book;
		}
	};


Мне бы хотелось от него избавиться, то есть сразу переводить ResultSet в лист с определенным МОИМ типом.
Например, у меня уже есть код, пока без spring-jdbc, примерно такой:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 public Users[] getAllUsers2() throws Exception {
        usersList.clear();
        try (Connection c = pool.getConnection()) {
            try (PreparedStatement ps = c.prepareStatement("select * from users")) {
                try (ResultSet rs = ps.executeQuery()) {
                    List<Object[]> records = new ArrayList<Object[]>();
                    int cols = rs.getMetaData().getColumnCount();
                    while (rs.next()) {
                        Object[] arr = new Object[cols];
                        for (int i = 0; i < cols; i++) {
                            arr[i] = rs.getObject(i + 1);
                        }
                        records.add(arr);
                    }
                    return usersList.toArray(new Users[0]); // это пока не важно, просто осталось от предыдущего варианта.
                }
            }
        }
    }



В нем List<Object[]> records, получается красивым, то есть все данные в нем хорошо и правильно лежат. Я тут погуглил, похоже нет способа, чтобы сразу сделать из него List<Users>. Например как-то через instanceof. Я пробовал не получилось. Выходит, что нужно просто перебирать через for исходный лист и создавать новые объекты типа Users, а потом добавлять их к List<Users> ?
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953361
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicВ частности в том, что не нужно заботиться о коннекте, пуле и очистке PreparedStatement, ResultSet ?

Да. А ещё удобно включать в транзакцию.


NixicМне бы хотелось от него избавиться, то есть сразу переводить ResultSet в лист с определенным МОИМ типом.

Я нифига не понял. Маппер не обязательно использовать. Там есть и другие способы читать из ResultSet.

NixicНапример, у меня уже есть код, пока без spring-jdbc, примерно такой:

Ага. Сразу видно, где просто и понятно, а где каша. Я бы призадумался.

NixicВ нем List<Object[]> records, получается красивым, то есть все данные в нем хорошо и правильно лежат.

Да с фига ли.

NixicЯ тут погуглил, похоже нет способа, чтобы сразу сделать из него List<Users>. Например как-то через instanceof. Я пробовал не получилось. Выходит, что нужно просто перебирать через for исходный лист и создавать новые объекты типа Users, а потом добавлять их к List<Users> ?
Я не понимаю откуда такая привязанность к своему коду, если очевидно что он хуже читается.
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953381
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczNixicВ нем List<Object[]> records, получается красивым, то есть все данные в нем хорошо и правильно лежат.

Да с фига ли.

А, ну так-то да, подебажил, там не совсем ровно всё лежит :)
типы со значением есть, а вот к какому полю оно относится... пошел дальше учиться :)
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953385
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
меня просто раздражает маленько вот такая конструкция:
Код: java
1.
2.
3.
4.
5.
6.
7.
Book book = new Book();
book.setId(rs.getInt("id"));
book.setComment(rs.getString("comment"));
book.setDateRelease(rs.getDate("date_release"));
book.setTitle(rs.getString("title"));
book.setAuthorId(rs.getInt("author_id"));
return book;


особенно, когда полей в таблице под 200 штук.

Но на сколько я понял из вашего выше примера:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
try (Connection c = dataSource.getConnection) {
    try (PreparedStatement ps = c.prepareStatement("SELECT * FROM users")) {
        try (ResultSet rs = ps.executeQuery()) {
            while(rs.next()) {
                users.add(toUser(rs));
            }
        }
    }
}


метод toUser(rs) можно написать один раз и использовать его, во всех запросах?
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953390
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicменя просто раздражает маленько вот такая конструкция:
Код: java
1.
2.
3.
4.
5.
6.
7.
Book book = new Book();
book.setId(rs.getInt("id"));
book.setComment(rs.getString("comment"));
book.setDateRelease(rs.getDate("date_release"));
book.setTitle(rs.getString("title"));
book.setAuthorId(rs.getInt("author_id"));
return book;


особенно, когда полей в таблице под 200 штук.


Это одна из причин появления hibernate и т.п. :)

try (PreparedStatement ps = c.prepareStatement("SELECT * FROM users")) {

Кстати, за select * надо бить больно, чтобы на всю жизнь запомнить, что порядок полей, случается, меняется.
Ладно поменяется int и String и будет exception, а если два похожих по логике поля?

Nixicметод toUser(rs) можно написать один раз и использовать его, во всех запросах?

Надо строго следить, чтобы список полей совпадал ( * нельзя). Лучше- вынести в константу.
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953393
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicменя просто раздражает маленько вот такая конструкция:
особенно, когда полей в таблице под 200 штук.

Для таких раздражительных есть 100500 способов автоматического и полуавтоматического маппинга колонок на свойства.
myBatis, QueryDSL, jOOQ, Apache Commons DBUtils и другие.
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953397
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominКстати, за select * надо бить больно, чтобы на всю жизнь запомнить, что порядок полей, случается, меняется.
Ладно поменяется int и String и будет exception, а если два похожих по логике поля?

С тем же успехом можно отдубасить и за отсутствие WHERE или LIMIT.

Если читать из RS по имени - не вижу никаких проблем. А вот если по-индексу, как у автора, то, да. Достаточно просто порядок колонок поменять и приехали.
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953410
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про * не задумывался :)
Использовал раньше Hibernate и бед особо не знал, кроме ленивой загрузки и прочих "вкусностей".
WHERE в запросах есть, лимит пока не использовал, (в хибере отдельно на query ставил, не в запросе) потому что переписал пока лишь 3 сущности и хочется сделать всё правильно с самого начала. А всего таблиц будет около 30 из 80-ти.
Спасибо за пинки в нужном направлении :)
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953415
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicА, ну так-то да, подебажил, там не совсем ровно всё лежит :)
типы со значением есть, а вот к какому полю оно относится... пошел дальше учиться :)
Потеря типизации это всегда плохо.
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953692
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это опять я :)

Два варианта метода, первый выкидывает ошибку при повторном использовании:

org.postgresql.util.PSQLException: Этот Sstatement был закрыт.
май 07, 2015 5:24:10 PM nix.tables.models.RequestTableModel getValueAt
SEVERE: null
java.sql.SQLException: Connection org.postgresql.jdbc4.Jdbc4Connection@4964784d is closed.
at org.apache.commons.dbcp2.DelegatingConnection.checkOpen(DelegatingConnection.java:605)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
public String getUsersVisibleNameById1(Integer id) throws Exception {
        String sql = "select visibleName from Users where id = " + id;
        String visibleName = "";
        try (Connection c = pool.getConnection()) {
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        visibleName = rs.getString("visibleName");
                    }
                }
            }
        }
        System.out.println(visibleName);
        return visibleName;
    }

    public String getUsersVisibleNameById(Integer id) throws Exception {
        String sql = "select visibleName from Users where id = " + id;
        String visibleName = "";
        try {
            con = pool.getConnection();
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                visibleName = rs.getString("visibleName");
            }
//            System.out.println(visibleName);
            return visibleName;
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            pool.close();
        }
        return null;
    }



Я как-то неправильно использую try-with-resources или как?
...
Рейтинг: 0 / 0
Apache Commons DBCP, Swing покритикуйте код.
    #38953723
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Потому что ваша реализация DBConnectionPool предельно кривая. Нормальный пул забирает соединения по Connection.close() и останавливает свою работу закрывая все физические соединения по pool.close();
Я уже писал выше, что соединения надо брать из DataSource, а не из своего странного велосипеда с квадратными колесами.
Класс DBConnectionPool избыточный.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache Commons DBCP, Swing покритикуйте код.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]