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

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

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

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

Код: 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
24.06.2015, 09:27
    #38991326
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSP, соединение к бд и ооп
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
24.06.2015, 10:12
    #38991359
anykey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSP, соединение к бд и ооп
Blazkowicz,
прошу прощения за причинения боли, но код не мой, хотя я тоже не специалист.

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


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