Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Pool соединение и рекурсия в сервлете как реализовать??? / 25 сообщений из 30, страница 1 из 2
29.08.2012, 12:28:46
    #37935098
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Пытаюсь создать 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
29.08.2012, 12:59:49
    #37935173
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gema,
и нафига весь этот велосипед нужен?
...
Рейтинг: 0 / 0
29.08.2012, 13:09:24
    #37935200
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Чтобы у пользователя в течении всего сеанса работы было одно подключение к БД. И потом один раз прописал насройки подключения к БД и потом пользуешься.
...
Рейтинг: 0 / 0
29.08.2012, 13:12:18
    #37935207
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gemaЧтобы у пользователя в течении всего сеанса работы было одно подключение к БД.Тогда пул вам противопоказан.И потом один раз прописал насройки подключения к БД и потом пользуешься.Для всего этого не требуется никаких листенеров и (отдельных) сервлетов.
...
Рейтинг: 0 / 0
29.08.2012, 13:14:08
    #37935212
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
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
29.08.2012, 13:15:52
    #37935216
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Basil A. Sidorov,
+1
аффтар! Самый простой вариант - на каждый вызов в сервлете - новое соединение в БД.
Все настройки брать в сервлете из констант из рессурса (XML)
...
Рейтинг: 0 / 0
29.08.2012, 13:17:58
    #37935223
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gemaЧтобы у пользователя в течении всего сеанса работы было одно подключение к БД.
Такая архитектура используется достаточно редко, только в случае если у вас пользователь авторизируется в базе данных. Соответсвенно соединение всегда содержит имя и права пользователя.
В высоконагруженых системах такой подход не используется, потому что в базах сильно ограничено максимальное количество соединений. Если у вас БД позволяет иметь только 200-1000 соединений, то это будет пределом пользователей в вашей системе.
При использовани пула и кратковременных соединений сервер может обслуживать на порядок больше пользователей при том же количестве физических соединений.


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

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

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

gemaВопрос тогда как правильно организовать пул в приложении?
На этот вопрос я подробно ответил выше. Что конкретно не понятно?
...
Рейтинг: 0 / 0
29.08.2012, 13:51:30
    #37935318
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gemaМетод close() - это попытка вернуть все соединения в пул, которые появились при использовании рекурсии.
О какой вообще рекурсии речь?
Почему "попытка"?
Почему во множественночи числе, когда закрывается одно соединение внутри?
...
Рейтинг: 0 / 0
29.08.2012, 13:57:05
    #37935330
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Т.е удаляем 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
29.08.2012, 14:00:21
    #37935338
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Как закрыть conn???
...
Рейтинг: 0 / 0
29.08.2012, 14:06:15
    #37935347
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
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
29.08.2012, 15:20:19
    #37935545
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Но ведь в таком случае соединений будет столько, сколько будет вызываться Cost2() при рекурсии, если я правильно понимаю.Кол-во соединений будет расти.Как с этим быть?
...
Рейтинг: 0 / 0
29.08.2012, 15:26:34
    #37935565
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gemaНо ведь в таком случае соединений будет столько, сколько будет вызываться Cost2() при рекурсии, если я правильно понимаю.Кол-во соединений будет расти.Как с этим быть?
Еле нашел где у вас рекурсия. Вызывайте Cost2() после закрытия соединения (возврата в пул).
...
Рейтинг: 0 / 0
29.08.2012, 15:44:44
    #37935629
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Извиняюсь за тупость, но итог должен быть такой? Просто хочется разобраться.
Код: 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
29.08.2012, 15:50:57
    #37935647
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gema,
записей много?
- без цикла сразу одним запросом посчитать сумму нельзя?
...
Рейтинг: 0 / 0
29.08.2012, 16:02:47
    #37935677
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Суть задачи в рекурсии. Нельзя тупо сумму в запросе посчитать. Есть еще вариант функцию на mysql написать с рекурсией.
...
Рейтинг: 0 / 0
29.08.2012, 16:17:55
    #37935723
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
gemaСуть задачи в рекурсии. Нельзя тупо сумму в запросе посчитать.
реальная задача? Рассказал бы.
Всегда интересно то, что НЕЛЬЗЯ )) и рекурсия в субд (кроме деревьев \ нодов)
...
Рейтинг: 0 / 0
29.08.2012, 16:30:33
    #37935742
gema
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pool соединение и рекурсия в сервлете как реализовать???
Есть система линейных уравнений размером где-то 40*40 с большим разбегом коэффициентов порядка 6-8 степеней. Пыталась решить задачу математическими методами, но появлялись решения, которые не подходили потом в систему. Причем я использовала не один метод, а несколько разных. Возможная причина в разбеге коэффициентов прочитала где-то, что такого быть не должно. И кроме того, точное решение задачи мне нужно, именно приближенное, что и достигается в использовании рекурсии.
Предметная область задачи - расчет себестоимости взаимозависимых продуктов.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Pool соединение и рекурсия в сервлете как реализовать??? / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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