powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSP, соединение к бд и ооп
9 сообщений из 9, страница 1 из 1
JSP, соединение к бд и ооп
    #38990870
anykey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть суперкласс описывающий соединение/ отсоединение к бд и производные от него классы, которые уже что то делают с бд. На самой начальной странице JSP происходит создание кучи объектов, и соответственно каждый объект, создает подключение что то делает с бд, закрывает соединение. До момента когда пользователю сформируется начальный HTML происходит от 25-50 соединений к бд и закрытие соединений. Кто то мне сказал что наибольшее время это соединение с бд при таких операциях, а не сами запросы. Насколько правильна такая архитектура, не лучше ли для производительности сделать один конект, сделать все нужное и потом закрыть соединение, чем спамить бд?

PS Довольно медленно jsp открывается в локальной сети 3-6 секунд.
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38990889
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
java.sql.DataSource
Настраиваете его в сервере
Получаете ссылку через JNDI
Паттерн использования:

Код: java
1.
2.
3.
try(Connection c = dataSource.getConnection()){
 ...
}
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38990892
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38991250
anykey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
JNDI то и используется, но как я говорил в каждом экземляре класса, которых куча создается на одной странице jsp. Спасибо за ссылку.
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38991271
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anykey33Blazkowicz,
JNDI то и используется, но как я говорил в каждом экземляре класса, которых куча создается на одной странице jsp. Спасибо за ссылку.

Нам предлагается угадать как выглядит код?
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38991288
anykey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так выглядит родительский класс.

Код: 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.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
package helper;
import org.apache.log4j.*;
import javax.sql.*;
import javax.naming.*;
import java.util.*;
import java.sql.*;
import java.io.*;

public class DataBaseHelper
{
    Logger log;
    public static final int BUFFER_SIZE = 4096;
    private static final String CONTEXT_PROPERTIES = "context";
    private static final String COMMON_PROPERTIES = "common";
    private static final String DS_JNDI_NAME = "jndi_name";
    private boolean m_isPropertyInit;
    private DataSource m_dataSource;
    private Context m_context;
    private boolean m_isDataSourceUsed;
    private String m_driverName;
    private String m_strURL;
    private String m_strPassword;
    private String m_strLogin;
    private String m_strShema;
    private String m_getallcompany;
    private String m_finecompanybyname;
    private String m_addcompany;
    
    public DataBaseHelper() {
        this.log = Logger.getLogger(DataBaseHelper.class.getName());
        this.m_dataSource = null;
        this.m_context = null;
        this.m_isDataSourceUsed = false;
        this.m_isPropertyInit = false;
        this.m_strURL = null;
        this.m_strPassword = null;
        this.m_strLogin = null;
    }
    
    private DataSource createDataSource() throws NamingException {
        final ResourceBundle contextRes = ResourceBundle.getBundle("common");
        final String strJNDI = contextRes.getString("jndi_name");
        if (this.m_context == null) {
            this.m_context = this.getRootContext();
        }
        return this.m_dataSource = (DataSource)this.m_context.lookup(strJNDI);
    }
    
    private Context getRootContext() throws NamingException {
        final Properties properties = new Properties();
        final ResourceBundle contextRes = ResourceBundle.getBundle("context");
        final Enumeration keys = contextRes.getKeys();
        if (keys != null) {
            while (keys.hasMoreElements()) {
                final String key = keys.nextElement();
                final String value = contextRes.getString(key);
                ((Hashtable<String, String>)properties).put(key, value);
            }
        }
        return this.m_context = new InitialContext(properties);
    }
    
    private DataSource getDataSource() throws NamingException {
        if (this.m_dataSource == null) {
            this.createDataSource();
        }
        return this.m_dataSource;
    }
    
    protected Connection getConnection() throws SQLException, NamingException {
        Connection conn = null;
        if (!this.m_isPropertyInit) {
            this.propertyInit();
        }
        if (!this.m_isDataSourceUsed) {
            try {
                Class.forName(this.m_driverName);
            }
            catch (ClassNotFoundException ex) {
                this.log.error((Object)("getConnection ex = " + ex.getLocalizedMessage()));
                ex.printStackTrace();
            }
        }
        if (this.m_isDataSourceUsed) {
            conn = this.getDataSource().getConnection();
        }
        else {
            conn = this.getConnectionFromURL();
        }
        if (this.m_strShema != null && this.m_strShema.length() > 0) {
            conn.createStatement().executeUpdate("set current schema " + this.m_strShema);
        }
        return conn;
    }
    
    private Connection getConnectionFromURL() throws SQLException {
        final Connection conn = DriverManager.getConnection(this.m_strURL, this.m_strLogin, this.m_strPassword);
        return conn;
    }
    
    protected void closeConnection(Connection conn) {
        if (conn != null) {
            Label_0066: {
                try {
                    if (!conn.isClosed()) {
                        conn.close();
                    }
                }
                catch (SQLException ex) {
                    ex.printStackTrace();
                    this.log.error((Object)("closeConnection SQLException = " + ex.getLocalizedMessage()));
                    break Label_0066;
                }
                finally {
                    conn = null;
                }
                conn = null;
                return;
            }
            conn = null;
        }
    }
    
    protected String converterClobToString(final Clob clob) throws SQLException {
        String result = null;
        if (clob != null) {
            try {
                final Reader clobReader = clob.getCharacterStream();
                final CharArrayWriter writer = new CharArrayWriter();
                final char[] buffer = new char[4096];
                int i = 0;
                while ((i = clobReader.read(buffer)) >= 0) {
                    writer.write(buffer, 0, i);
                }
                writer.flush();
                writer.close();
                result = writer.toString();
            }
            catch (IOException ex) {
                this.log.error((Object)"convertClobToString IOException");
                ex.printStackTrace();
                result = null;
            }
        }
        return result;
    }
    
    public String getSQLaddCompany() {
        return this.m_addcompany;
    }
    
    public String getSQLforAllCompany() {
        return this.m_getallcompany;
    }
    
    public String getSQLfindCompanyByName() {
        return this.m_finecompanybyname;
    }
    
    private void propertyInit() {
        final ResourceBundle contextRes = ResourceBundle.getBundle("common");
        this.m_isDataSourceUsed = new Boolean(contextRes.getString("connection.use_datasource"));
        this.m_driverName = contextRes.getString("connection.driver_class_name");
        this.m_strURL = contextRes.getString("connection.database_url");
        this.m_strLogin = contextRes.getString("connection.database_user");
        this.m_strPassword = contextRes.getString("connection.database_password");
        this.m_strShema = contextRes.getString("connection.schema");
        this.m_isPropertyInit = true;
    }
}

...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38991326
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anykey33,

Ваш код делает мне больно. Класс полностью бесполезный. Какой смысл от выбора между DataSource или DriverManager?
Если вдруг не DataSource, то пусть всё тормозит?
По факту, такой класс выбрасывается из проекта и проект от этого не страдает.

Хорошим подходом является использование DataSource, который предоставляет контейнер. Достаточно один раз в каждом контейнере настроить DataSource и проект без проблем устанавливается и обновляется на любой из них.

Подход похуже, но тоже имеющий право на жизнь - Maven profiles, с помощью которых можно собрать разные сборки с разными настройками подключения к БД для разных серверов. В таком случае можно самостоятельно создать и сконфигурировать DataSource внутри приложения через Apache Commons DBCP или его аналог.

Ваш код бесполезен
ResourceBundle используется для интернационализации ресурсов. Для настроек не удобен.
Выбор между DataSource и DriverManager бесполезен. Только DataSource. В клиническом случае можно взять готовый DriverManagerDataSource.
closeConnection() не нужен. DataSource и try-with-resource обо всём позаботятся.
Label_0066 навевает мысли о декомпиляции.
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38991359
anykey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
прошу прощения за причинения боли, но код не мой, хотя я тоже не специалист.

>Label_0066 навевает мысли о декомпиляции.
Так точно.
...
Рейтинг: 0 / 0
JSP, соединение к бд и ооп
    #38991365
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мопед не мой?
Тогда по вопросу - оптимальным решением с точки зрения производительности является пул соединений и максимально короткое использование Connection. Пул нивелирует затраты на получение и закрытие Connection.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSP, соединение к бд и ооп
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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