powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL-запросы
31 сообщений из 31, показаны все 2 страниц
SQL-запросы
    #33431654
Sherst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Столкнулся с такой проблемой: необходимо выполнить определенное число SQL-запросов в цикле.
Посоветуйте как правильно сделать.
Вот урезанный код программы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 try {
   Class .forName(driverName);
  connect=DriverManager.getConnection(databaseURL,prop);
  statement=connect.createStatement();
  resultset=statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
  	
   while (resultset.next()){
    //Как здесь правильно выполнять SQL-запросы,можно ли исп.объект statement несколько раз		
    //приблизительная строка
    //resultset2=statement.executeQuery("SELECT * FROM T2 WHERE NodeID="+resultSet.getString(1));	
  }

  resultset.close();
  statement.close();
  connect.close();
}
 catch (Exception e){
  System.err.println(e);
}

Заранее спасибо.
...
Рейтинг: 0 / 0
SQL-запросы
    #33431794
Sherst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал код таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 try {
   Class .forName(driverName);
  connect=DriverManager.getConnection(databaseURL,prop);
  statement=connect.createStatement();
  resultset=statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
 //Объявил PreparedStatement st	
   while (resultset.next()){
     st=connect.prepareStatement(sqlString);
     resultset2=st.executeQuery();
     resultset2.close();
     st.close();
  }

  resultset.close();
  statement.close();
  connect.close();
}
 catch (Exception e){
  System.err.println(e);
}

Посоветуйте как теперь правильно закрывать объекты.
Нужно ли в цикле while закрывать объект Connection
...
Рейтинг: 0 / 0
SQL-запросы
    #33431902
tomasso
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На мой взгляд в цикле закрывать объект Connection не просто нет необходимости, но и неправильно, также нет необходимости каждый раз закрывать объекты resultset2, и ps!
Я думаю это должно происходить примерно так:
Код: plaintext
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.
PreparedStatement ps= null ;
 PreparedStatement pstmt= null ;
 ResultSet rslt= null ;
 StringBuffer query= new  StringBuffer();
		 query.append("SELECT * ");
		 query.append("FROM NEWS ");
	  try {
			 con=connect();
			 pstmt=con.prepareStatement(query.toString());
			 rslt=pstmt.executeQuery();
			   while (rslt.next()){
				ps= null ;
                                resultset2 =  null ;
				ps= preparedst(con,query1.toString());
				resultset2=ps.executeUpdate();
				con.commit();
			 }
			 rslt.close();
			 pstmt.close();
			 con.close();
		 }  catch (SQLException e){
			 System.err.println(" e = "+e.getMessage());
		 }  finally {
			  try {
				rslt.close();
				pstmt.close();
				con.close();
				}
			 }  catch (SQLException e){
				 System.err.println(" e = "+e.getMessage());
			 }
		 }
	
...
Рейтинг: 0 / 0
SQL-запросы
    #33432302
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошим тоном считается указание имен серверов и версии сипользуемых компонент.
У тебя крупная ошибка если ты использует autocommit mode=true тот тогда та можеш иметь по спецификации только один открытый resultset. Некоторые севрера вообще могутиметь только один открытый resultset в одном connection.
Далее надо оборачивать в try{} finally использование объектов.
Код: plaintext
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.
 try {
   Class .forName(driverName);
  connect=DriverManager.getConnection(databaseURL,prop);
   try {
   connect.setAutoCommit(false);
    try {
  statement=connect.createStatement();
 //Объявил PreparedStatement st	
    try {
     st=connect.prepareStatement(sqlString);
    try {
  resultset=statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
   while (resultset.next()){
     resultset2=st.executeQuery();
      try {
       .....
     }
       finally {
     resultset2.close();
     }
  }

  } finally {
    resultset.close();
  } finally {
     st.close();
   }
  } finally {
  statement.close();
  }
  } finally {
  connect.close();
  }
}
 catch (Exception e){
  System.err.println(e);
}
...
Рейтинг: 0 / 0
SQL-запросы
    #33432324
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet?
ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым.
...
Рейтинг: 0 / 0
SQL-запросы
    #33432862
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timmесли не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet?
А прямо в документации на setAutoCommit.
The commit occurs when the statement completes or the next execute occurs
Т.е. когда у тебя идет excute в любом Statement вызывается commit, что равно закрытию всех ResultSet.
Timm
ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым.
Хм. а имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически.
...
Рейтинг: 0 / 0
SQL-запросы
    #33433005
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Путилин Timmесли не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet?
А прямо в документации на setAutoCommit.
The commit occurs when the statement completes or the next execute occurs
Т.е. когда у тебя идет excute в любом Statement вызывается commit, что равно закрытию всех ResultSet.
Timm
ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым.
Хм. а имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически.
1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов.
2) а что утечка то? одного finally вполне достаточно...
...
Рейтинг: 0 / 0
SQL-запросы
    #33433012
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timmиз одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true
можно. только что проверил. ms sql 2000, jsqlconnect.
...
Рейтинг: 0 / 0
SQL-запросы
    #33433021
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов.

Не уверен что правильно понял. Смысл в том что ты при выполнении любого statement'а, получиш commit для Connection. Со всеми вытекающими последтвиями.
Timm2) а что утечка то? одного finally вполне достаточно...
Хм. а что будет с Connection если у тебя в ps.close() вылетит exception? Лично ловился
...
Рейтинг: 0 / 0
SQL-запросы
    #33433046
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Путилин Timm
1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов.

Не уверен что правильно понял. Смысл в том что ты при выполнении любого statement'а, получиш commit для Connection. Со всеми вытекающими последтвиями.
Timm2) а что утечка то? одного finally вполне достаточно...
Хм. а что будет с Connection если у тебя в ps.close() вылетит exception? Лично ловился
дык пофиг на коммит. вопрос, насколько я понял, в другом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 try 
}
 catch  (SQLException e)
{
}
 finally 
{
    if  (rs !=  null )  try  {rs.close();}  catch  (Throwable t) {rs =  null ;}
    if  (pstmt !=  null )  try  {pstmt.close();}  catch  (Throwable t) {pstmt =  null ;}
    if  (conn !=  null )  try  {conn.close();}  catch  (Throwable t) {conn =  null ;}
}

finally - один.
...
Рейтинг: 0 / 0
SQL-запросы
    #33433283
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi
Timm
дык пофиг на коммит. вопрос, насколько я понял, в другом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 try 
}
 catch  (SQLException e)
{
}
 finally 
{
    if  (rs !=  null )  try  {rs.close();}  catch  (Throwable t) {rs =  null ;}
    if  (pstmt !=  null )  try  {pstmt.close();}  catch  (Throwable t) {pstmt =  null ;}
    if  (conn !=  null )  try  {conn.close();}  catch  (Throwable t) {conn =  null ;}
}

finally - один.
О ужас =8-0
Ты не то считаеш, во первых у тебя 4 try проив 3-х моих. Во вторых у тебя на каждый ресурс по 4 дополнительных операции
-- при объявлении
Код: plaintext
=  null ;
--
Код: plaintext
 if  (rs !=  null ) 
-- еще дополнительный блок
Код: plaintext
1.
2.
3.
4.
5.
6.
 
 try  
{
....close();
}  catch  (Throwable t)  
{...= null ;}
--
Код: plaintext
=  null ;
при обработке Throwable
Еще ты теряеш исключения коотрые происходят в close().
Т.е. ты написал почти то что и я, только обвешал многими дополнительными рющечками которые нафиг не нужны.
...
Рейтинг: 0 / 0
SQL-запросы
    #33433345
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно не знаю постановку задачи, но нельзя ли использовать вместо:

Код: plaintext
SELECT * FROM T2 WHERE NodeID="+resultSet.getString( 1 ));

вот это:

Код: plaintext
SELECT * FROM T2 WHERE NodeID in ("+ nodes +");

?

То есть nodes будет генериться в цикле, а потом ВНЕ цикла будет выполняться запрос...

--
nexus
...
Рейтинг: 0 / 0
SQL-запросы
    #33433441
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ПутилинHi
Timm
дык пофиг на коммит. вопрос, насколько я понял, в другом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 try 
}
 catch  (SQLException e)
{
}
 finally 
{
    if  (rs !=  null )  try  {rs.close();}  catch  (Throwable t) {rs =  null ;}
    if  (pstmt !=  null )  try  {pstmt.close();}  catch  (Throwable t) {pstmt =  null ;}
    if  (conn !=  null )  try  {conn.close();}  catch  (Throwable t) {conn =  null ;}
}

finally - один.
О ужас =8-0
Ты не то считаеш, во первых у тебя 4 try проив 3-х моих. Во вторых у тебя на каждый ресурс по 4 дополнительных операции
-- при объявлении
Код: plaintext
=  null ;
--
Код: plaintext
 if  (rs !=  null ) 
-- еще дополнительный блок
Код: plaintext
1.
2.
3.
4.
5.
6.
 
 try  
{
....close();
}  catch  (Throwable t)  
{...= null ;}
--
Код: plaintext
=  null ;
при обработке Throwable
Еще ты теряеш исключения коотрые происходят в close().
Т.е. ты написал почти то что и я, только обвешал многими дополнительными рющечками которые нафиг не нужны.
1) я плохо считаю? у тебя 6 try'ев. у меня - один основной. Try которые в finally - только для проформы.
2) Throwable на то и написано, что пойух, че там происходит. главное - обnull'ить
по поводу рюшечек - не знаю что ты там имеешь ввиду... но твой код читать гораздо неудобней - каждй чих для чего то ловится, но сути не меняет. чтоб уж было понятно, вот 2 куска кода.
твой
Код: plaintext
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.
         try 
        {
             Class .forName("");
            Connection connect = DriverManager.getConnection("", "");
             try 
            {
                connect.setAutoCommit(false);
                 try 
                {
                    Statement statement = connect.createStatement();                    
                     try 
                    {
                        Statement st = connect.prepareStatement("");
                        ResultSet resultset =  null ;
                         try 
                        {
                            resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
                             while  (resultset.next())
                            {
                                ResultSet resultset2 = st.executeQuery("");
                                 try 
                                {
                                    //.....
                                }
                                 finally 
                                {
                                    resultset2.close();
                                }
                            }

                        }
                         finally 
                        {
                            resultset.close();
                        }
                    }
                     finally 
                    {
                        statement.close();
                    }
                }
                 finally 
                {
                    connect.close();
                }
            }
             catch  (Exception e)
            {
                System.err.println(e);
            }
        }
         catch  (ClassNotFoundException c)
        {

        }
мой
Код: plaintext
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.
        Connection connect =  null ;
        ResultSet resultset =  null ;
        ResultSet resultset2 =  null ;
        Statement st =  null ;
        Statement statement =  null ;
         try 
        {
             Class .forName("");
            connect = DriverManager.getConnection("",  null );
            connect.setAutoCommit(false);
            statement = connect.createStatement();
            st = connect.prepareStatement("");
            resultset =  null ;
            resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
             while  (resultset.next())
            {
                resultset2 = st.executeQuery("");
                //
            }
        }
         catch  (ClassNotFoundException c)
        {
        }
         catch  (SQLException e)
        {
            System.err.println(e);
        }
         finally 
        {
             if  (resultset !=  null )  try  {}  catch (Throwable t) {resultset =  null ;}
             if  (resultset2 !=  null )  try  {}  catch  (Throwable t) {resultset2 =  null ;}
             if  (st !=  null )  try  {}  catch  (Throwable t) {st =  null ;}
             if  (statement !=  null )  try  {}  catch  (Throwable t) {statement =  null ;}
             if  (connect !=  null )  try  {}  catch  (Throwable t) {connect =  null ;}
        }
что лучше читается - по моему ясно.
...
Рейтинг: 0 / 0
SQL-запросы
    #33433454
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm



согласен с оратором.


-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
SQL-запросы
    #33433620
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
1) я плохо считаю? у тебя 6 try'ев. у меня - один основной. Try которые в finally - только для проформы . Ясь ?, что не знаю применение этого слова к програмированию.

Timm
2) Throwable на то и написано, что пойух, че там происходит. главное - обnull'ить. обнулять нафиг не
Обнулять не надо вообще.

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

Вот здесь ты приврал.
Код: plaintext
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.
         try  {
             Class .forName("");
            Connection connect = DriverManager.getConnection("", "", "");
             try  {
                connect.setAutoCommit(false);
                Statement statement = connect.createStatement();
                 try  {
                    Statement st = connect.prepareStatement("");
                    ResultSet resultset =  null ;
                     try  {
                        resultset = statement.executeQuery(
                                "SELECT * FROM T2 WHERE ParentID=0");
                         while  (resultset.next()) {
                            ResultSet resultset2 = st.executeQuery("");
                             try  {
                                //.....
                            }
                             finally  {
                                resultset2.close();
                            }
                        }
                    }
                     finally  {
                        resultset.close();
                    }
                }
                 finally  {
                    statement.close();
                }
            }
             catch  (Exception e) {
                System.err.println(e);
            }
             finally  {
                connect.close();
            }
        }
         catch  (SQLException e) {
            System.err.println(e);
        }
         catch  (ClassNotFoundException c) {
        }
Размер файла 1711 байт(немного + на импорт) размер бинарного файла 1481. Количество try 5 штук.

Код: plaintext
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.
        Connection connect =  null ;
        ResultSet resultset =  null ;
        ResultSet resultset2 =  null ;
        Statement st =  null ;
        Statement statement =  null ;
         try  {
             Class .forName("");
            connect = DriverManager.getConnection("",  null );
            connect.setAutoCommit(false);
            statement = connect.createStatement();
            st = connect.prepareStatement("");
            resultset =  null ;
            resultset = statement.executeQuery(
                    "SELECT * FROM T2 WHERE ParentID=0");
             while  (resultset.next()) {
                resultset2 = st.executeQuery("");
                //
            }
        }
         catch  (ClassNotFoundException c) {
        }
         catch  (SQLException e) {
            System.err.println(e);
        }
         finally  {
             if  (resultset !=  null )
                 try  {
                    resultset.close();
                }
                 catch  (Throwable t) {
                    resultset =  null ;
                }
             if  (resultset2 !=  null )
                 try  {
                    resultset2.close();
                }
                 catch  (Throwable t) {
                    resultset2 =  null ;
                }
             if  (st !=  null )
                 try  {
                    st.close();
                }
                 catch  (Throwable t) {
                    st =  null ;
                }
             if  (statement !=  null )
                 try  {
                    statement.close();
                }
                 catch  (Throwable t) {
                    statement =  null ;
                }
             if  (connect !=  null )
                 try  {
                    connect.close();
                }
                 catch  (Throwable t) {
                    connect =  null ;
                }
        }
Размер файла 2151 байт (немного + на импорт) размер бинарного файла 1552
Количество try 6 штук.

Timmчто лучше читается - по моему ясно.
ну да, согласен только передергивать не надо.
...
Рейтинг: 0 / 0
SQL-запросы
    #33434673
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать???

так вот напрмер нельзя?
Код: plaintext
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.
 try  {
             Class .forName("");
            Connection connect = DriverManager.getConnection("", "", "");
            connect.setAutoCommit(false);
            
             try  {                
                Statement statement = connect.createStatement();
                Statement st = connect.prepareStatement("");
                ResultSet resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
                 while  (resultset.next()) {
                	ResultSet resultset2 = st.executeQuery("");
                	//....
                }                              
            }
             catch  (SQLException e) {
                //ошибка в запросах
                System.err.println(e);
            }
             finally  {
            	connect.commit();
                connect.close();
            }
            
        }
         catch  (SQLException e) {
            //ошибка в коннекте
            System.err.println(e);
        }
         catch  (ClassNotFoundException c) {
        	System.err.println(c);
        }
...
Рейтинг: 0 / 0
SQL-запросы
    #33434718
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SherstПривет всем!
Столкнулся с такой проблемой: необходимо выполнить определенное число SQL-запросов в цикле.
Посоветуйте как правильно сделать.
Вот урезанный код программы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 try {
   Class .forName(driverName);
  connect=DriverManager.getConnection(databaseURL,prop);
  statement=connect.createStatement();
  resultset=statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
  	
   while (resultset.next()){
    //Как здесь правильно выполнять SQL-запросы,можно ли исп.объект statement несколько раз		
    //приблизительная строка
    //resultset2=statement.executeQuery("SELECT * FROM T2 WHERE NodeID="+resultSet.getString(1));	
  }

  resultset.close();
  statement.close();
  connect.close();
}
 catch (Exception e){
  System.err.println(e);
}

Заранее спасибо.
А что, параметризованные запросы уже под запретом?!
По-моему, просто пишешь запрос с параметром и в цикле этот параметр меняешь...
...
Рейтинг: 0 / 0
SQL-запросы
    #33434724
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LinerА зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать???

так вот напрмер нельзя?

делать commit в блоке finally - не самая хорошая идея. хотя все зависит
от задачи. в общем случае - это неправильно. к тому же в соотв. блоке
catch лучше делать явный rollback.

А.Грасоff™
...
Рейтинг: 0 / 0
SQL-запросы
    #33435068
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LinerА зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать???

так вот напрмер нельзя?
Код: plaintext
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.
 try  {
             Class .forName("");
            Connection connect = DriverManager.getConnection("", "", "");
            connect.setAutoCommit(false);
            
             try  {                
                Statement statement = connect.createStatement();
                Statement st = connect.prepareStatement("");
                ResultSet resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
                 while  (resultset.next()) {
                	ResultSet resultset2 = st.executeQuery("");
                	//....
                }                              
            }
             catch  (SQLException e) {
                //ошибка в запросах
                System.err.println(e);
            }
             finally  {
            	connect.commit();
                connect.close();
            }
            
        }
         catch  (SQLException e) {
            //ошибка в коннекте
            System.err.println(e);
        }
         catch  (ClassNotFoundException c) {
        	System.err.println(c);
        }

Что у тебя будет с connect.close(); если в connect.commit(); вылетит исключение например по deadlock ?
...
Рейтинг: 0 / 0
SQL-запросы
    #33435127
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ делать commit в блоке finally - не самая хорошая идея. хотя все зависит от задачи. в общем случае - это неправильно. к тому же в соотв. блоке
catch лучше делать явный rollback.
А зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true).
Евгений ПутилинЧто у тебя будет с connect.close(); если в connect.commit(); вылетит исключение например по deadlock ?
Согласен, поторопился, нужно переместить commit выше в конец блока try и все, хотя если например нужно чтобы в базу пошли те запросы которые корректные и отработали до вылета, тогда commit нужно обернуть в еще try-catch

Вопрос не о том хотел задать, вопрос зачем писать по 5 try-catch? Чтобы в правильном порядке закрыть resultset и statement?
Но они и сами прекрасно закроются когда в текущем блоке кода больше не останется на них ссылок или когда закроется подключение.

Зачем в них null записывать и городить для этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 finally 
        {
             if  (resultset !=  null )  try  {}  catch (Throwable t) {resultset =  null ;}
             if  (resultset2 !=  null )  try  {}  catch  (Throwable t) {resultset2 =  null ;}
             if  (st !=  null )  try  {}  catch  (Throwable t) {st =  null ;}
             if  (statement !=  null )  try  {}  catch  (Throwable t) {statement =  null ;}
             if  (connect !=  null )  try  {}  catch  (Throwable t) {connect =  null ;}
        }
...
Рейтинг: 0 / 0
SQL-запросы
    #33435163
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Liner А.Грасоff™ делать commit в блоке finally - не самая хорошая идея. хотя все зависит от задачи. в общем случае - это неправильно. к тому же в соотв. блоке
catch лучше делать явный rollback.
А зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true).
Евгений ПутилинЧто у тебя будет с connect.close(); если в connect.commit(); вылетит исключение например по deadlock ?
Согласен, поторопился, нужно переместить commit выше в конец блока try и все, хотя если например нужно чтобы в базу пошли те запросы которые корректные и отработали до вылета, тогда commit нужно обернуть в еще try-catch

Вопрос не о том хотел задать, вопрос зачем писать по 5 try-catch? Чтобы в правильном порядке закрыть resultset и statement?
Но они и сами прекрасно закроются когда в текущем блоке кода больше не останется на них ссылок или когда закроется подключение.

Зачем в них null записывать и городить для этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 finally 
        {
             if  (resultset !=  null )  try  {}  catch (Throwable t) {resultset =  null ;}
             if  (resultset2 !=  null )  try  {}  catch  (Throwable t) {resultset2 =  null ;}
             if  (st !=  null )  try  {}  catch  (Throwable t) {st =  null ;}
             if  (statement !=  null )  try  {}  catch  (Throwable t) {statement =  null ;}
             if  (connect !=  null )  try  {}  catch  (Throwable t) {connect =  null ;}
        }

следи за темой :)
последнее - это мое.
явное об'nullение - для случая когда на close() вылетит exeption.
...
Рейтинг: 0 / 0
SQL-запросы
    #33435244
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timmследи за темой :)
последнее - это мое.
явное об'nullение - для случая когда на close() вылетит exeption.
Слежу, это тоже твое
Timm
ResultSet resultset = null;
...
resultset = null;
resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
А зачем нужно явное об'nullение всех объектов?
Все ResultSet, Statement можно описать в блоке try - блок закрылся, все объекты ушли.
Тем более пишут
Евгений Путилина имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически
а потом все равно их закрывают, на всякий случай наверное :-)

И вот так должно нормально работать
Код: plaintext
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.
Connection connect =  null ;        
 try  {
     Class .forName("");
    connect = DriverManager.getConnection("", "", "");
    connect.setAutoCommit(false);
                             
    Statement statement = connect.createStatement();
    Statement st = connect.prepareStatement("");
    ResultSet resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
     while  (resultset.next()) {
    	ResultSet resultset2 = st.executeQuery("");
       	//....
    }                    
    connect.commit();
}
 catch  (SQLException e) {		
    System.err.println(e);
}
 catch  (ClassNotFoundException c) {
    System.err.println(c);
}
 finally  {
	 try  {
	     if  (connect!= null ) {connect.close();}
	}
	 catch  (SQLException e) {
	    connect =  null ;
	    System.err.println(e);
	}	
}
...
Рейтинг: 0 / 0
SQL-запросы
    #33436294
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Liner
Тем более пишут
Евгений Путилина имет утечку всех ресурсов лучше? Хотя если закрывается statement то RS должен закрытся автоматически
а потом все равно их закрывают, на всякий случай наверное :-)

Не на всякий случай а т.к. так принято. В освобождении ресурсов.
Liner
И вот так должно нормально работать
Код: plaintext
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.
Connection connect =  null ;        
 try  {
     Class .forName("");
    connect = DriverManager.getConnection("", "", "");
    connect.setAutoCommit(false);
                             
    Statement statement = connect.createStatement();
    Statement st = connect.prepareStatement("");
    ResultSet resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
     while  (resultset.next()) {
    	ResultSet resultset2 = st.executeQuery("");
       	//....
    }                    
    connect.commit();
}
 catch  (SQLException e) {		
    System.err.println(e);
}
 catch  (ClassNotFoundException c) {
    System.err.println(c);
}
 finally  {
	 try  {
	     if  (connect!= null ) {connect.close();}
	}
	 catch  (SQLException e) {
	    connect =  null ;
	    System.err.println(e);
	}	
}

Оно работать наверное будет. Можно вообще так написать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Connection connect =  null ;        
 try  {
     Class .forName("");
    connect = DriverManager.getConnection("", "", "");
    connect.setAutoCommit(false);
                             
    Statement statement = connect.createStatement();
    Statement st = connect.prepareStatement("");
    ResultSet resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0");
     while  (resultset.next()) {
    	ResultSet resultset2 = st.executeQuery("");
       	//....
    }                    
    connect.commit();
}
 catch  (SQLException e) {		
    System.err.println(e);
}
 catch  (ClassNotFoundException c) {
    System.err.println(c);
}
 finally  {
	    System.exit( 0 );
}
В случаее если тебе нужно будет 10^6 раз выполнить запроc и ты каждый раз будеш препарировать заново то получиш утечку памяти и на клиенте и на сервере.
...
Рейтинг: 0 / 0
SQL-запросы
    #33436353
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LinerА зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true).а где про это сказано?
...
Рейтинг: 0 / 0
SQL-запросы
    #33437529
Sergey Karpenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю вопрос стоит в выборке древовидных структур из БД. Если да то ваш вариант подходит плохо только потому что уровень вложености ограничен тут нужны рекурсивные алгоритмы. Вообщем хотелось бы знать зачем такая структура нужна. Да кстати если в качестве сервера БД используется Oracle или скажем PostgreSQL то может подумать над использованием запроса Connect by prior? Он вам всю структуру за один запрос нарисует. Если де нет то может попробовать другую структуру БД когда у листьев только указатель на корневую ноду и поле LEVEL которое показывает глубину вложенности?
...
Рейтинг: 0 / 0
SQL-запросы
    #33438358
mansch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такие задачи решаються на уровне sql
или strored procedures
...
Рейтинг: 0 / 0
SQL-запросы
    #33438744
Sergey Karpenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
manschтакие задачи решаються на уровне sql
или strored procedures
Именно это я и хотел сказать :)
...
Рейтинг: 0 / 0
SQL-запросы
    #33439164
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ПутилинВ случае если тебе нужно будет 10^6 раз выполнить запроc и ты каждый раз будеш препарировать заново то получиш утечку памяти и на клиенте и на сервере.
Код: plaintext
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.
Connection connect =  null ;        
 try  {
     Class .forName("");
    connect = DriverManager.getConnection("", "", "");
    connect.setAutoCommit(false);
                             
    Statement statement = connect.createStatement(); //создается 1 раз
    Statement st = connect.prepareStatement(""); //создается 1 раз
    ResultSet resultset = statement.executeQuery("SELECT * FROM T2 WHERE ParentID=0"); //создается 1 раз
     while  (resultset.next()) {
    	ResultSet resultset2 = st.executeQuery("");
       	//....
    }                    
    connect.commit();
}
 catch  (SQLException e) {		
    System.err.println(e);
}
 catch  (ClassNotFoundException c) {
    System.err.println(c);
}
 finally  {
	 try  {
	     if  (connect!= null ) {connect.close();}
	}
	 catch  (SQLException e) {
	    connect =  null ;
	    System.err.println(e);
	}	
}
Очень интересно, и в каком месте я получу утечки?
10^6 раз может выполнится только ResultSet resultset2 = st.executeQuery(""); в цикле. Ну и что что препарить буду, это один и тот же statement, никаких утечек на серваке не будет. На клиенте - ссылок на resultset2 не остается - garbage collector без проблем сам разберется.
Если я не догоняю чего-то напишите где будут утечки.

Я почему спросил про try-catch, суть не то что ресурсы освобождать не надо,
ИМХО заворачивать каждый объект в try-finally не стоит, не такие уж тут гигантские растраты. Это ладно тут всего 2 стейтмента, а если их штук 5-7 будет, причем большинство вы только 1 раз откроете? На что ваш код похож будет???

Тут у Timm вроде бы универсальное решение (у него тоже кстати внутри цикла resultset2 не закрывается, так что из вашей логики 10^6 запросов в его коде сожрут столько же памяти) :-) все объекты который он использует в блоке try он объявляет выше а в finally просто контроль всех этих объектов чтоб закрыты были, это удобно, везде одинаково и не нужно думать закроется ли все или нет - 100% закроется.

Но вопрос а нужно ли это вообще делать если следующей командой подключение закрываете???? а connection.close() - автоматом закрывает все объекты связанные с ним?
авторpublic void close() throws SQLException
Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released

Хотя может быть (точно не знаю, мож кто-нить просветит) так тщательно нужно закрывать объекты если, например, используется пул соединений, но тут я так понял мы говорим об обычном подключении.
...
Рейтинг: 0 / 0
SQL-запросы
    #33439236
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ LinerА зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true).а где про это сказано?
Хотел написать, что если после ошибок, подключение закрываем - зачем делать rollback? Из javadoc насчет connection.close():
Releases this Connection object's database and JDBC resources
immediately instead of waiting for them to be automatically releasedСессия закроется и изменения в базу не уйдут.

Но решил еще почитать и наткнулся на вот эту статейку.
Офигеть!!!!
...
Рейтинг: 0 / 0
SQL-запросы
    #33439306
Sherst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Sergey Karpenkov

Да, вопрос стоит в выборе древовидных структур из БД.В качестве сервера исп. Interbase.
Структура таблицы такая: [ИдентификаторУзла] [ИмяУзла] [УказательНаРодитель]

Алгоритм построения написан выше (сначала пишу запрос на выбор узлов у которых нет родителя,затем в цикле для каждого такого узла выполняю запрос по поиску его детей,если дети существуют то к род. узлу добавляю фиктивный узел).

mansch
такие задачи решаються на уровне sql
или strored procedures

Т.е. писать хранимую процедуру с параметром - по которому выбираются
родительские узлы?
...
Рейтинг: 0 / 0
SQL-запросы
    #33440077
Sergey Karpenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sherstto Sergey Karpenkov

Да, вопрос стоит в выборе древовидных структур из БД.В качестве сервера исп. Interbase.
Структура таблицы такая: [ИдентификаторУзла] [ИмяУзла] [УказательНаРодитель]

Алгоритм построения написан выше (сначала пишу запрос на выбор узлов у которых нет родителя,затем в цикле для каждого такого узла выполняю запрос по поиску его детей,если дети существуют то к род. узлу добавляю фиктивный узел).


Дёргать базу из-за каждой ветки дерева идея очень плохая. Если конечно вложеность и количество узлов не оч большое то это прокатит, но при росте вложености и количества узлов абсолютно бесполезная трата ресурсов БД. В любом случае даже если следовать вашему алгоритму, то надо если есть такая возможность применять ленивую выборку. Если же надо всё дерево сразу, то я бы сильно подумал и всё таки попробовал изменить структуру так чтобы можно было сделать выборку за один приём, а потом уже рекурсивным алгоритмом разобрать полученый результ сет. Посмотрите вот сюда
http://sdm.viptop.ru/articles/sqltrees.html может быть поможет.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL-запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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