powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL-запросы
25 сообщений из 31, страница 1 из 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
25 сообщений из 31, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL-запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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