Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Singleton при большой нагрузке. / 15 сообщений из 15, страница 1 из 1
29.07.2015, 10:08
    #39018327
anykey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
Есть кучка (17-15) "одиночных" экземпляров Singleton классов, которые делают запросы( select, update) из оракла, и на основе некоторых запросов, уже порождают конкретные экземпляры других классов ( как пользовательские типы или структуры в c#).
Рационально ли использовать синглтон вообще ( в плане производительности), когда клиентов на одну страницу jsp может быть до 5-ти тысяч одновременно?
В данном коде как я понял нет никакой реализации того что к единому экземпляру обратились 5-10 клиентов, и тогда что очередь будет, пока метод экземпляра отработает?

Пример класса

Код: 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.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
public class CompTivBeanFactory extends DataBaseHelper
{
    Logger log;
    private static final String GET_ALL_COMPUTERS = "select * from COMPUTER";
    private static final String GET_NUM_RECORDS = "select count(*) from COMPUTER";
    private static final String GET_COMP_BY_CSID = "select * from COMPUTER where COMPUTER_SYS_ID=?";
    private static final String GET_COMP_BY_OID = "select * from COMPUTER where TME_OBJECT_ID=?";
    private static final String GET_COMP_BY_HOST = "SELECT distinct * from computer where (upper(computer_alias) = upper(?) or upper(tme_object_label)=upper(?)) and (RECORD_TIME in (SELECT max(record_time) as record_time from computer where (upper(computer_alias) = upper(?) or upper(tme_object_label)=upper(?))))";
    private static CompTivBeanFactory m_factory;
    
    static {
        CompTivBeanFactory.m_factory = null;
    }
    
    private CompTivBeanFactory() throws NullPointerException {
        this.log = Logger.getLogger(CompTivBeanFactory.class.getName());
    }
    
    public static CompTivBeanFactory getFactory() throws NullPointerException {
        if (CompTivBeanFactory.m_factory == null) {
            CompTivBeanFactory.m_factory = new CompTivBeanFactory();
        }
        return CompTivBeanFactory.m_factory;
    }
    
    public CompTivBean getCompByOID(String oid) {
        CompTivBean bean = null;
        Connection con = null;
        Label_0157: {
            try {
                con = this.getConnection();
                PreparedStatement ps = null;
                ps = con.prepareStatement("select * from COMPUTER where TME_OBJECT_ID=?");
                oid = String.valueOf(oid) + "+#TMF_Endpoint::Endpoint#";
                ps.setString(1, oid);
                this.log.debug((Object)("Ищем компьютер с oid=" + oid));
                final ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    bean = this.convertResultSetToItem(rs);
                }
                else {
                    this.log.error((Object)("can't read computer info by oid=" + oid));
                }
            }
            catch (Exception e) {
                e.printStackTrace();
                break Label_0157;
            }
            finally {
                this.closeConnection(con);
            }
            this.closeConnection(con);
            return bean;
        }
        this.closeConnection(con);
        return bean;
    }
    
    public CompTivBean getCompByHost(final String hostn) {
        CompTivBean bean = null;
        Connection con = null;
        Label_0164: {
            try {
                con = this.getConnection();
                PreparedStatement ps = null;
                ps = con.prepareStatement("SELECT distinct * from computer where (upper(computer_alias) = upper(?) or upper(tme_object_label)=upper(?)) and (RECORD_TIME in (SELECT max(record_time) as record_time from computer where (upper(computer_alias) = upper(?) or upper(tme_object_label)=upper(?))))");
                ps.setString(1, hostn);
                ps.setString(2, hostn);
                ps.setString(3, hostn);
                ps.setString(4, hostn);
                this.log.debug((Object)("Ищем компьютер с COMPUTER_ALIAS=" + hostn));
                final ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    bean = this.convertResultSetToItem(rs);
                }
                else {
                    this.log.error((Object)("can't read computer info by name=" + hostn));
                }
            }
            catch (Exception e) {
                e.printStackTrace();
                break Label_0164;
            }
            finally {
                this.closeConnection(con);
            }
            this.closeConnection(con);
            return bean;
        }
        this.closeConnection(con);
        return bean;
    }
    
    public CompTivBean getCompByCSID(final String csid) {
        CompTivBean bean = null;
        Connection con = null;
        Label_0100: {
            try {
                con = this.getConnection();
                PreparedStatement ps = null;
                ps = con.prepareStatement("select * from COMPUTER where COMPUTER_SYS_ID=?");
                ps.setString(1, csid);
                final ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    bean = this.convertResultSetToItem(rs);
                }
                else {
                    this.log.error((Object)"can't read department info");
                }
            }
            catch (Exception e) {
                e.printStackTrace();
                break Label_0100;
            }
            finally {
                this.closeConnection(con);
            }
            this.closeConnection(con);
            return bean;
        }
        this.closeConnection(con);
        return bean;
    }
    
    public int getNumRecords() {
        Connection con = null;
        int result = 0;
        Label_0074: {
            try {
                con = this.getConnection();
                PreparedStatement ps = null;
                ps = con.prepareStatement("select count(*) from COMPUTER");
                final ResultSet rs = ps.executeQuery();
                rs.next();
                result = rs.getInt(1);
            }
            catch (Exception e) {
                e.printStackTrace();
                break Label_0074;
            }
            finally {
                this.closeConnection(con);
            }
            this.closeConnection(con);
            return result;
        }
        this.closeConnection(con);
        return result;
    }
    
    public Collection getAllComputers() {
        Connection con = null;
        final Collection result = new ArrayList();
        Label_0089: {
            try {
                con = this.getConnection();
                PreparedStatement ps = null;
                ps = con.prepareStatement("select * from COMPUTER");
                final ResultSet rs = ps.executeQuery();
                while (rs.next()) {
                    result.add(this.convertResultSetToItem(rs));
                }
            }
            catch (Exception e) {
                e.printStackTrace();
                break Label_0089;
            }
            finally {
                this.closeConnection(con);
            }
            this.closeConnection(con);
            return result;
        }
        this.closeConnection(con);
        return result;
    }
    
    private CompTivBean convertResultSetToItem(final ResultSet rs) throws SQLException {
        final CompTivBean bean = new CompTivBean();
        final String csid = rs.getString("COMPUTER_SYS_ID");
        final Date computer_scantime = rs.getDate("COMPUTER_SCANTIME");
        final String tme_object_id = rs.getString("TME_OBJECT_ID");
        final String tme_object_label = rs.getString("TME_OBJECT_LABEL");
        final String computer_model = rs.getString("COMPUTER_MODEL");
        final Date computer_boot_time = rs.getDate("COMPUTER_BOOT_TIME");
        final String computer_alias = rs.getString("COMPUTER_ALIAS");
        final String sys_ser_num = rs.getString("COMPUTER_ALIAS");
        final String os_name = rs.getString("OS_NAME");
        final String os_type = rs.getString("OS_TYPE");
        final long os_major_vers = rs.getLong("OS_MAJOR_VERS");
        final long os_minor_vers = rs.getLong("OS_MINOR_VERS");
        final String os_sub_vers = rs.getString("OS_SUB_VERS");
        final String os_inst_date = rs.getString("OS_INST_DATE");
        final String registered_owner = rs.getString("REGISTERED_OWNER");
        final String registered_org = rs.getString("REGISTERED_ORG");
        final String keybord_type = rs.getString("KEYBOARD_TYPE");
        final long funktion_keys = rs.getLong("FUNCTION_KEYS");
        final String tz_locale = rs.getString("TZ_LOCALE");
        final String tz_name = rs.getString("TZ_NAME");
        final String tz_daylight_name = rs.getString("TZ_DAYLIGHT_NAME");
        final String on_savings_time = rs.getString("ON_SAVINGS_TIME");
        final long tz_seconds = rs.getLong("TZ_SECONDS");
        final String time_direction = rs.getString("TIME_DIRECTION");
        final Date record_time = rs.getDate("RECORD_TIME");
        final String os_kernel_mode = rs.getString("OS_KERNEL_MODE");
        final String os_lang_vers = rs.getString("OS_LANG_VERS");
        final String os_lcid = rs.getString("OS_LCID");
        final String current_lcid = rs.getString("CURRENT_LCID");
        final String os_arch = rs.getString("CURRENT_LCID");
        bean.setCsid(csid);
        bean.setComputer_scantime(computer_scantime);
        bean.setTme_object_id(tme_object_id);
        bean.setTme_object_label(tme_object_label);
        bean.setComputer_model(computer_model);
        bean.setComputer_boot_time(computer_boot_time);
        bean.setComputer_alias(computer_alias);
        bean.setSys_ser_num(sys_ser_num);
        bean.setOs_name(os_name);
        bean.setOs_type(os_type);
        bean.setOs_major_vers(os_major_vers);
        bean.setOs_minor_vers(os_minor_vers);
        bean.setOs_sub_vers(os_sub_vers);
        bean.setOs_inst_date(os_inst_date);
        bean.setRegistered_owner(registered_owner);
        bean.setRegistered_org(registered_org);
        bean.setKeybord_type(keybord_type);
        bean.setFunktion_keys(funktion_keys);
        bean.setTz_locale(tz_locale);
        bean.setTz_name(tz_name);
        bean.setTz_daylight_name(tz_daylight_name);
        bean.setOn_savings_time(on_savings_time);
        bean.setTz_seconds(tz_seconds);
        bean.setTime_direction(time_direction);
        bean.setRecord_time(record_time);
        bean.setOs_kernel_mode(os_kernel_mode);
        bean.setOs_lang_vers(os_lang_vers);
        bean.setOs_lcid(os_lcid);
        bean.setCurrent_lcid(current_lcid);
        bean.setOs_arch(os_arch);
        return bean;
    }
}


PS Мопед не мой, я просто разместил объяву (с)
...
Рейтинг: 0 / 0
29.07.2015, 10:14
    #39018335
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33PS Мопед не мой, я просто разместил объяву (с)

Лень читать сей говнокод.
1. Использовать пул коннектов.
2. На каждый запрос- получить коннект из пула, сделать preparedStatement запрос, заполнить параметрами, выполнить, закомитить, закрыть запрос, вернуть коннект в пул.

Тогда всё будет хорошо, и будит управляться размером пула.

PS: почему preparedStatement даже если запрос каждый раз создаётся- объяснять надо? Минимум две причины, и обе серьёзные.
...
Рейтинг: 0 / 0
29.07.2015, 10:17
    #39018338
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33
Код: java
1.
2.
3.
4.
5.
...
        Label_0157: {
...
                this.log.debug((Object)("Ищем компьютер с oid=" + oid));
...


PS Мопед не мой, я просто разместил объяву (с)

Твой, не твой- но вываливать выхлоп декомпилятора в конференцию- это неприлично...
...
Рейтинг: 0 / 0
29.07.2015, 10:28
    #39018351
anykey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
Alexey TominТвой, не твой- но вываливать выхлоп декомпилятора в конференцию- это неприлично...
Сорри, но preparedStatement есть в гавнокоде. У меня вопрос как у новичка в принципе, синглтон нормален как паттерн в данном случае или нет, абстрагировано без относительно к пулу?
...
Рейтинг: 0 / 0
29.07.2015, 10:44
    #39018373
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33,
ну нет такого слова "абстрактно нормален" ))))
Как у жванецкого))
Даже если будет очередь, то потоки создаст контейнер. Тебе легче от этого?
...
Рейтинг: 0 / 0
29.07.2015, 11:25
    #39018420
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33,
судя по коду
1) это не синглтон. Поксольку jsp и 5 тысяч клиентов, а метод getFactory() ничем не защищен, вероятно создание нескольких экземпляров CompTivBeanFactory из разных потоков
2) в конкретном примере можно обойтись статическими методами, а значит, синглтон тут - лишняя абстракция. Если совсем крохоборствовать, ухудшающая производительность (getFactory() и лишнее обращение к стеку :)).
3) Возможно, причины создания синглтона есть в предке (DataBaseHelper), но тут этого не видно. Интересно было бы посмотреть что происходит в методе this.getConnection(), могут быть сюрпризы в многопоточной среде
...
Рейтинг: 0 / 0
29.07.2015, 11:44
    #39018446
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33Alexey TominТвой, не твой- но вываливать выхлоп декомпилятора в конференцию- это неприлично...
Сорри, но preparedStatement есть в гавнокоде.

Я ж говорю- не читал особо код :D

anykey33У меня вопрос как у новичка в принципе, синглтон нормален как паттерн в данном случае или нет, абстрагировано без относительно к пулу?

Вообще если у класса нет состояния- то он может быть синглтоном.
У DAO "состояние"- это пул коннектов- а он один.
Так что DAO может быть синглтоном.

Вот если пула нет, то возникает вопрос- коннект что, один? Если да- то синглтон будет очень плохо- коннект внутри синхронизирован и все запросы выстроятся в очередь.
Если коннект создаётся каждый раз (что уже безумие), то у класса вообще нет состояния и без разницы.

Но если класс не синглтон и коннект у каждого свой- то их количество будет расти бесконтрольно, что может привести к проблемам со стороны как сервера БД, так и тамошних админов (поэтому надо сначала прикинуть, кто кого побить сможет при выяснении отношений) :)
...
Рейтинг: 0 / 0
29.07.2015, 12:03
    #39018477
anykey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
ivanraanykey33,
судя по коду
1) это не синглтон. Поксольку jsp и 5 тысяч клиентов, а метод getFactory() ничем не защищен, вероятно создание нескольких экземпляров CompTivBeanFactory из разных потоков
2) в конкретном примере можно обойтись статическими методами, а значит, синглтон тут - лишняя абстракция. Если совсем крохоборствовать, ухудшающая производительность (getFactory() и лишнее обращение к стеку :)).
3) Возможно, причины создания синглтона есть в предке (DataBaseHelper), но тут этого не видно. Интересно было бы посмотреть что происходит в методе this.getConnection(), могут быть сюрпризы в многопоточной среде

А разве не защищает getFactory() этот код? Вроде как он один на всех, я дебаг лог смотрел на тестовом сервере, конструкторы пишутся только при первом подключении, один раз и до перегрузки сервера, они не создаются судя по логу.

Код: java
1.
2.
3.
4.
5.
6.
7.
private static CompTivBeanFactory m_factory;
public static CompTivBeanFactory getFactory() throws NullPointerException {
        if (CompTivBeanFactory.m_factory == null) {
            CompTivBeanFactory.m_factory = new CompTivBeanFactory();
        }
        return CompTivBeanFactory.m_factory;
    }



Вот DataBaseHelper, приложение крутится на вебсфере может оно конечно пулами рулит.

Код: 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.
public class DataBaseHelper
{
    Logger log;
    public static final int BUFFER_SIZE = 4096;
    private static final String CONTEXT_PROPERTIES = "com.hetnet.common.context";
    private static final String COMMON_PROPERTIES = "com.hetnet.common.common";
    private static final String DS_JNDI_NAME = "hetnet.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("com.hetnet.common.common");
        final String strJNDI = contextRes.getString("connection.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("com.hetnet.common.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("com.hetnet.common.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_getallcompany = contextRes.getString("sql.tivoli.inventory.company.all");
        this.m_finecompanybyname = contextRes.getString("sql.tivoli.inventory.company.find.by.name");
        this.m_addcompany = contextRes.getString("sql.tivoli.inventory.company.add");
        this.m_isPropertyInit = true;
    }
}


...
Рейтинг: 0 / 0
29.07.2015, 12:21
    #39018502
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
[quot anykey33]

А разве не защищает getFactory() этот код? Вроде как он один на всех, я дебаг лог смотрел на тестовом сервере, конструкторы пишутся только при первом подключении, один раз и до перегрузки сервера, они не создаются судя по логу.

Код: java
1.
2.
3.
4.
5.
6.
7.
private static CompTivBeanFactory m_factory;
public static CompTivBeanFactory getFactory() throws NullPointerException {
        if (CompTivBeanFactory.m_factory == null) { //  тут можем спокойно получить null, даже если значение поля уже присвоено (синхронизации нет, volatile нет) 
            CompTivBeanFactory.m_factory = new CompTivBeanFactory(); // тут создаем и присваиваем новое значение, в независимости от того, создан ли уже CompTivBeanFactory и в другом потоке
        }
        return CompTivBeanFactory.m_factory;
    }
...
Рейтинг: 0 / 0
29.07.2015, 12:40
    #39018527
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
Alexey TominНо если класс не синглтон и коннект у каждого свой- то их количество будет расти бесконтрольно, что может привести к проблемам со стороны как сервера БД, так и тамошних админов (поэтому надо сначала прикинуть, кто кого побить сможет при выяснении отношений) :)
для корпоратива - потянет (коннект на начало сессии).
Для обезличенного анонимного веб юзверя - нет.
...
Рейтинг: 0 / 0
29.07.2015, 12:46
    #39018535
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33 Рационально ли использовать синглтон вообще ( в плане производительности), когда клиентов на одну страницу jsp может быть до 5-ти тысяч одновременно?
Давайте пойдем от обратного и вы распишете почему по-вашему это может быть не рационально?
...
Рейтинг: 0 / 0
29.07.2015, 12:57
    #39018550
anykey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
Blazkowiczanykey33 Рационально ли использовать синглтон вообще ( в плане производительности), когда клиентов на одну страницу jsp может быть до 5-ти тысяч одновременно?
Давайте пойдем от обратного и вы распишете почему по-вашему это может быть не рационально?
Мое воображение рисовало, длинную очередь к единому для всех методу в котором нужно выполнить запрос, но сейчас склоняюсь к тому, что куча запросов от вебсервера к базе данных будет еще хуже.
...
Рейтинг: 0 / 0
29.07.2015, 13:18
    #39018578
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33 Мое воображение рисовало, длинную очередь к единому для всех методу в котором нужно выполнить запрос, но сейчас склоняюсь к тому, что куча запросов от вебсервера к базе данных будет еще хуже.
Вашему воображению пора начать изучать параллельное программирование.
https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html
Очереди выстраиваются только за блокировками.
В работе с БД из Java очередь может возникнуть только если
synchronized/Lock используется в Java коде.
Пул соединений слишком мал и часто блокируется, так как все соединения используются.
Происходит много апдейтов и БД приходится синхронизировать транзакции блокируя отдельные участки данных.

Другая проблема это безопасная инициализация синглтона при высокой нагрузке именно в момент инициализации. Но для неё есть простое решение.
...
Рейтинг: 0 / 0
29.07.2015, 13:31
    #39018599
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
anykey33 Вот DataBaseHelper, приложение крутится на вебсфере может оно конечно пулами рулит.

Тут следует бояться не проблем с производительностью. Код не готов к работе с множеством потоков.
Что можно сделать по-быстрому
- сделать синглтон в DataBaseHelper
- в самом DataBaseHelper всю инициализацию перенести в статический инициализатор класса (неленивый синглтон), тем временем изучать параллельное программирование, чтобы потом написать настоящий ленивый синглтон
- отказаться от наследования от DataBaseHelper, максимум - использовать композицию. DataBaseHelper и фабрики бинов выполняют совершенно разные задачи
- сами фабрики бинов в синглтонах не нуждаются, это паттерн ради паттерна, по крайней мере в приведенном классе CompTivBeanFactory. Изучать паттерны, для чего они нужны
...
Рейтинг: 0 / 0
29.07.2015, 14:14
    #39018664
anykey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton при большой нагрузке.
Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Singleton при большой нагрузке. / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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