powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Pool соединение и рекурсия в сервлете как реализовать???
25 сообщений из 30, страница 1 из 2
Pool соединение и рекурсия в сервлете как реализовать???
    #37935098
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь создать pool-соединение проекта.
Созданию pool соединение используя класс AbstractDao и ServletContextListener.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	package db;
	import javax.sql.DataSource;
	 
	public abstract class AbstractDao {
	       protected final DataSource datasource;
	       public AbstractDao() {
	        datasource = DatasourceConnection.getDataSource();
	    }
	}



Код: 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.
	package db;
	 
        import javax.naming.Context;
	import javax.naming.InitialContext;
	import javax.naming.NamingException;
	import javax.servlet.http.HttpSessionListener;
	import javax.servlet.ServletContext;
	import javax.servlet.ServletContextEvent;
	import javax.servlet.ServletContextListener;
	import javax.sql.DataSource;
	 
	public class DatasourceConnection implements ServletContextListener {
	    private ServletContext ctx;
	    private static DataSource datasource;
	 
	    public void contextDestroyed(ServletContextEvent event) {
	        // TODO Auto-generated method stub
	    }
 
	    public void contextInitialized(ServletContextEvent event) {
	        Context initCtx = null;
	        Context envCtx = null;
	        ctx = event.getServletContext();
	        try {
	            initCtx = new InitialContext();
	            envCtx = (Context) initCtx.lookup("java:comp/env");
	            datasource = (DataSource) envCtx.lookup("jdbc/mysql");
	            ctx.setAttribute("DBCPool", datasource);
	        } catch (NamingException e) {
	            e.printStackTrace();
	        }
	    }
	}


web.xml
Код: xml
1.
2.
3.
<listener>
	              <listener-class>db.DatasourceConnection</listener-class>
	   </listener>



И сервлет, от которого наследуются все остальные
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	package db;
	 
	import javax.servlet.ServletException;
	import javax.servlet.http.HttpServlet;
	import javax.sql.DataSource;
	 
	public class init extends HttpServlet {
	 
	    public DataSource datasource = null;
	    @Override
	    public void init() throws ServletException {
	        datasource = (DataSource) getServletContext().getAttribute("DBCPool");
	 
	    }
	}


Вопрос в том, как сделать в сервлете с рекурсией одно соединение на весь сервлет. Пытаюсь вот так и ничего не получается.
Код: 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.
package calc;
	 
	import java.io.IOException;
	import java.io.PrintWriter;
	import java.math.BigDecimal;
	import java.sql.Connection;
	import java.sql.PreparedStatement;
	import java.sql.ResultSet;
	import java.sql.SQLException;
	import java.util.logging.Level;
	import java.util.logging.Logger;
	import javax.servlet.ServletException;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	 
     	public class cost1 extends db.init {
	 
	    Connection conn = null;
	 
	    public void init() throws ServletException {
	        try {
	            conn = datasource.getConnection();
	        } catch (SQLException ex) {
	            Logger.getLogger(costp1.class.getName()).log(Level.SEVERE, null, ex);
	        }
	 
	    }
	 
	    public void close() {
	        if (conn != null) {
	            try {
	                conn.close();
	            } catch (SQLException ex) {
	                Logger.getLogger(costp1.class.getName()).log(Level.SEVERE, null, ex);
	            }
	        }
	    }
	 
	    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        response.setContentType("text/html;charset=UTF-8");
	        PrintWriter out = response.getWriter();
	        try {
	         
	            Cost2(1, BigDecimal.ONE);
	 
	        } finally {
	            out.close();
	        }
	    }
	 
	    public BigDecimal Cost2(Integer product_id, BigDecimal k) {
	        PreparedStatement ps = null;
	        ResultSet rset = null;
	        BigDecimal cost = BigDecimal.ZERO;
	        String query;
	        BigDecimal summa1 = null;
	        try {
	            if (k.compareTo(new BigDecimal("1e-3")) < 0) {
	                cost = BigDecimal.ZERO;
	            } else {
	                query = "select .......l";
	                ps = conn.prepareStatement(query);
	                cost = BigDecimal.ZERO;
	                while (rset.next()) {
	                    if (rset.getString("param").equals("0")) {
	                        summa1 = rset.getBigDecimal("sum");
	                    } else {
	                        summa1 = rset.getBigDecimal("coef").multiply(Cost2(product_id, k.multiply(rset.getBigDecimal("coef"))));
	                    }
	                    cost = cost.add(summa1.setScale(2, BigDecimal.ROUND_HALF_UP));
	                }
	            }
	        } catch (SQLException ex) {
	            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
	        } finally {
	            try {
	                if (rset != null) {
	                    rset.close();
	                }
	                if (ps != null) {
	                    ps.close();
	                }
	            } catch (SQLException ex) {
	                Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
	            }
	 
	            return cost.setScale(2, BigDecimal.ROUND_HALF_UP);
	        }
    }
	 
	    @Override
	    protected void doGet(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }
	 
	    @Override
	    protected void doPost(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }
	 
	}
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935173
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gema,
и нафига весь этот велосипед нужен?
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935200
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы у пользователя в течении всего сеанса работы было одно подключение к БД. И потом один раз прописал насройки подключения к БД и потом пользуешься.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935207
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaЧтобы у пользователя в течении всего сеанса работы было одно подключение к БД.Тогда пул вам противопоказан.И потом один раз прописал насройки подключения к БД и потом пользуешься.Для всего этого не требуется никаких листенеров и (отдельных) сервлетов.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935212
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaСозданию pool соединение используя класс AbstractDao и ServletContextListener.
javax.sql.DataSource это и есть пул. А не то что вы создаёте.

gemaИ сервлет, от которого наследуются все остальные

Это как раз отличный пример злоупотребления наследованием. Не нужно наследовать классы только для того чтобы использовать какую-то готовую функциональность. Погуглите на тему "наследование" против "делегирования".
В вашем дизайне - вы не можете сделать так чтобы не сервлет использовал готовый код работы с пулом.
Вы не сможете наследовать сервлеты от других классов, потому что множественного наследования в Java нет и родитель уже ваш класс init.
Интересно как это вообще работает, у вас класс наследние переопределяет init родителя и никак не использует super.init(). Что тогда вообще даёт наследование от init?
Ознакомьтесь с общепринятыми coding conventions в Java. Тогда ваш код будет понятнее другим.


gemaВопрос в том, как сделать в сервлете с рекурсией одно соединение на весь сервлет. Пытаюсь вот так и ничего не получается.

Скорее всего вы спрашиваете про класс ThreadLocal. Но в вашей задаче он скорее всего не нужен. Хорошей практикой считается получить соединение из пула, использовать, и как можно быстрее "закрыть" - отдать обратно в пул. Таким образом вы минимизируете количество одновременно открытых соединений при максимальном количестве запросов к сервлетам.

Почему у вас время жизни соединения привязано к времени жизни сервлета - не понятно. И что это за close() метод сервлета вообще?

Если соединение требуется иметь дольше для поддержки единой транзакции проходящей через много разных методов, то стоит сразу обратить внимание на такие фреймверки как Spring IoC и Spring MVC, либо EJB.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935216
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
+1
аффтар! Самый простой вариант - на каждый вызов в сервлете - новое соединение в БД.
Все настройки брать в сервлете из констант из рессурса (XML)
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935223
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaЧтобы у пользователя в течении всего сеанса работы было одно подключение к БД.
Такая архитектура используется достаточно редко, только в случае если у вас пользователь авторизируется в базе данных. Соответсвенно соединение всегда содержит имя и права пользователя.
В высоконагруженых системах такой подход не используется, потому что в базах сильно ограничено максимальное количество соединений. Если у вас БД позволяет иметь только 200-1000 соединений, то это будет пределом пользователей в вашей системе.
При использовани пула и кратковременных соединений сервер может обслуживать на порядок больше пользователей при том же количестве физических соединений.


gemaИ потом один раз прописал насройки подключения к БД и потом пользуешься.
DataSource для этих целей штука правильная. Весь остальной код у вас делает слишком сложным образом очень простые вещи.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935225
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Все настройки брать в сервлете из констант из рессурса (XML)
Не-не-не. DataSource - правильный путь.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935237
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123Все настройки брать в сервлете из констант из рессурса (XML)
Не-не-не. DataSource - правильный путь.
да ради Бога.
У меня ДЕМО сайт работает как я написал)))
Можно считать это извратом - нагрузка небольшая ))
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935242
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123У меня ДЕМО сайт работает как я написал)))

Это очень важно.
Petro123Можно считать это извратом - нагрузка небольшая ))
Нагрузка тут не при чем. Просто в нормальном комерческом проекте проще переносить, собирать и разворачивать приложение на разные сервера, когда соединение в базе настроено один раз в самом контейнере.
Это изначально хорошая практика, к которой стоит привыкать.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935259
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
да. Согласен. Просто у меня сервер один. У него не знаю.
Просто, в целях, обучения, если идти по шагам, то код сверху надо выкинуть и дописать 2 строки констант.
А потом уже DS. Хотя бы чтобы знать что для чего служит.
IMHO
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935303
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть получается, что логика моего приложения не верна.
Прочитала на форуме http://www.javatalks.ru/ftopic30425.php&highlight=abstractdao и взяла за образец.
Вопрос тогда как правильно организовать пул в приложении?
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935313
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>И что это за close() метод сервлета вообще?
Метод close() - это попытка вернуть все соединения в пул, которые появились при использовании рекурсии.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935314
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaТо есть получается, что логика моего приложения не верна.
Логику вашего приложения можете оценить только вы сами. А ошибки у вас в дизайне имеются.

gemaПрочитала на форуме http://www.javatalks.ru/ftopic30425.php&highlight=abstractdao и взяла за образец.
Читайте англоязычные статьи, а не темы на форумы, где такие же как вы новички наступают сразу на все грабли.

gemaВопрос тогда как правильно организовать пул в приложении?
На этот вопрос я подробно ответил выше. Что конкретно не понятно?
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935318
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaМетод close() - это попытка вернуть все соединения в пул, которые появились при использовании рекурсии.
О какой вообще рекурсии речь?
Почему "попытка"?
Почему во множественночи числе, когда закрывается одно соединение внутри?
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935330
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е удаляем AbstractDao,Listener, init и делаем вот так:
context.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" 
         crossContext="true" 
         debug="5" path="/plo" reloadable="true">
    <Resource auth="Container" 
              autoReconnect="true" 
              autoReconnectForPools="true" 
              defaultAutoCommit="true"
              driverClassName="com.mysql.jdbc.Driver"
              maxActive="200" 
              maxIdle="30" 
              maxWait="10"
              minEvictableIdleTimeMillis="60000" 
              name="jdbc/mysql" 
              password="" 
              testOnBorrow="true"
              testWhileIdle="true" 
              timeBeatweenEvictionRunsMillis="10000" 
              type="javax.sql.DataSource" 
              url="jdbc:mysql://localhost:3306/plo?noAccessToProcedureBodies=true&amp;characterEncoding=utf-8&amp;autoReconnect=true" 
              username="" 
              validationQuery="Select 1 from dual"/>
</Context>


Код: 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.
package calc;
	 
	import java.io.IOException;
	import java.io.PrintWriter;
	import java.math.BigDecimal;
	import java.sql.Connection;
	import java.sql.PreparedStatement;
	import java.sql.ResultSet;
	import java.sql.SQLException;
	import java.util.logging.Level;
	import java.util.logging.Logger;
	import javax.servlet.ServletException;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	 
     	public class cost1  extends HttpServlet {
	 
	    Connection conn = null;
	 
	  public void init() throws ServletException {
        try {
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            datasource = (DataSource) envCtx.lookup("jdbc/mysql");
            conn = datasource.getConnection();
        } catch (SQLException ex) {
            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NamingException ex) {
            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
	
	    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        response.setContentType("text/html;charset=UTF-8");
	        PrintWriter out = response.getWriter();
	        try {
	         
	            Cost2(1, BigDecimal.ONE);
	 
	        } finally {
	            out.close();
	        }
	    }
	 
	    public BigDecimal Cost2(Integer product_id, BigDecimal k) {
	        PreparedStatement ps = null;
	        ResultSet rset = null;
	        BigDecimal cost = BigDecimal.ZERO;
	        String query;
	        BigDecimal summa1 = null;
	        try {
	            if (k.compareTo(new BigDecimal("1e-3")) < 0) {
	                cost = BigDecimal.ZERO;
	            } else {
	                query = "select .......l";
	                ps = conn.prepareStatement(query);
	                cost = BigDecimal.ZERO;
	                while (rset.next()) {
	                    if (rset.getString("param").equals("0")) {
	                        summa1 = rset.getBigDecimal("sum");
	                    } else {
	                        summa1 = rset.getBigDecimal("coef").multiply(Cost2(product_id, k.multiply(rset.getBigDecimal("coef"))));
	                    }
	                    cost = cost.add(summa1.setScale(2, BigDecimal.ROUND_HALF_UP));
	                }
	            }
	        } catch (SQLException ex) {
	            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
	        } finally {
	            try {
	                if (rset != null) {
	                    rset.close();
	                }
	                if (ps != null) {
	                    ps.close();
	                }
	            } catch (SQLException ex) {
	                Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
	            }
	 
	            return cost.setScale(2, BigDecimal.ROUND_HALF_UP);
	        }
    }
	 
	    @Override
	    protected void doGet(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }
	 
	    @Override
	    protected void doPost(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }
	 
	}
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935338
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как закрыть conn???
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935347
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gema,

Connection нельзя делать полем сервлета. Один экземпляр сервлета параллельно обслуживает множественные подключения клиентов.
В поле, вроде бы, можно вынести сам DataSource.
Нужна работа с базой, делаем так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
try{
       conn = dataSource.getConnection();
       workWithDB(conn);
catch(SQLExcepton e){
       processException(e);
}
finally{
       DBUtils.closeQuitely(conn);
}
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935545
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но ведь в таком случае соединений будет столько, сколько будет вызываться Cost2() при рекурсии, если я правильно понимаю.Кол-во соединений будет расти.Как с этим быть?
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935565
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaНо ведь в таком случае соединений будет столько, сколько будет вызываться Cost2() при рекурсии, если я правильно понимаю.Кол-во соединений будет расти.Как с этим быть?
Еле нашел где у вас рекурсия. Вызывайте Cost2() после закрытия соединения (возврата в пул).
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935629
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за тупость, но итог должен быть такой? Просто хочется разобраться.
Код: 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.
package calc;
	 
	import java.io.IOException;
	import java.io.PrintWriter;
	import java.math.BigDecimal;
	import java.sql.Connection;
	import java.sql.PreparedStatement;
	import java.sql.ResultSet;
	import java.sql.SQLException;
	import java.util.logging.Level;
	import java.util.logging.Logger;
	import javax.servlet.ServletException;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	 
     	public class cost1  extends HttpServlet {
	 
	   
	 
	  public void init() throws ServletException {
        try {
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            datasource = (DataSource) envCtx.lookup("jdbc/mysql");
            
        } catch (SQLException ex) {
            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NamingException ex) {
            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
	
	    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        response.setContentType("text/html;charset=UTF-8");
	        PrintWriter out = response.getWriter();
	        try {
	         
	            Cost2(1, BigDecimal.ONE);
	 
	        } finally {
	            out.close();
	        }
	    }
	 
	    public BigDecimal Cost2(Integer product_id, BigDecimal k) {
	         Connection conn = null;
                PreparedStatement ps = null;
	        ResultSet rset = null;
	        BigDecimal cost = BigDecimal.ZERO;
	        String query;
	        BigDecimal summa1 = null;
	        try {
	            if (k.compareTo(new BigDecimal("1e-3")) < 0) {
	                cost = BigDecimal.ZERO;
	            } else {
	                сonn = datasource.getConnection();
                        query = "select .......l";
	                ps = conn.prepareStatement(query);
	                cost = BigDecimal.ZERO;
	                while (rset.next()) {
	                    if (rset.getString("param").equals("0")) {
	                        summa1 = rset.getBigDecimal("sum");
	                    } else {
                                DBUtils.closeQuitely(conn);
	                        summa1 = rset.getBigDecimal("coef").multiply(Cost2(product_id, k.multiply(rset.getBigDecimal("coef"))));
	                    }
	                    cost = cost.add(summa1.setScale(2, BigDecimal.ROUND_HALF_UP));
	                }
	            }
	        } catch (SQLException ex) {
	            Logger.getLogger(costp.class.getName()).log(Level.SEVERE, null, ex);
	        } finally {
	            DBUtils.closeQuitely(conn); 
	            return cost.setScale(2, BigDecimal.ROUND_HALF_UP);
	        }
    }
	 
	    @Override
	    protected void doGet(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }
	 
	    @Override
	    protected void doPost(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }
	 
	}
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935647
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gema,
записей много?
- без цикла сразу одним запросом посчитать сумму нельзя?
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935677
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть задачи в рекурсии. Нельзя тупо сумму в запросе посчитать. Есть еще вариант функцию на mysql написать с рекурсией.
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935723
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gemaСуть задачи в рекурсии. Нельзя тупо сумму в запросе посчитать.
реальная задача? Рассказал бы.
Всегда интересно то, что НЕЛЬЗЯ )) и рекурсия в субд (кроме деревьев \ нодов)
...
Рейтинг: 0 / 0
Pool соединение и рекурсия в сервлете как реализовать???
    #37935742
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть система линейных уравнений размером где-то 40*40 с большим разбегом коэффициентов порядка 6-8 степеней. Пыталась решить задачу математическими методами, но появлялись решения, которые не подходили потом в систему. Причем я использовала не один метод, а несколько разных. Возможная причина в разбеге коэффициентов прочитала где-то, что такого быть не должно. И кроме того, точное решение задачи мне нужно, именно приближенное, что и достигается в использовании рекурсии.
Предметная область задачи - расчет себестоимости взаимозависимых продуктов.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Pool соединение и рекурсия в сервлете как реализовать???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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