Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL-запросы / 25 сообщений из 31, страница 1 из 2
12.12.2005, 20:35
    #33431654
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Привет всем!
Столкнулся с такой проблемой: необходимо выполнить определенное число 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
12.12.2005, 23:56
    #33431794
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Переписал код таким образом:
Код: 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
13.12.2005, 07:12
    #33431902
tomasso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
На мой взгляд в цикле закрывать объект 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
13.12.2005, 10:55
    #33432302
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Хорошим тоном считается указание имен серверов и версии сипользуемых компонент.
У тебя крупная ошибка если ты использует 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
13.12.2005, 11:02
    #33432324
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
если не секрет, где написано о том что при autocommit = true можно иметь только один открытый ResultSet?
ps. try ... finally конечно же надо использовать, но в таких количествах... по моему нецелесообразно, да и код становится неудобочитаемым.
...
Рейтинг: 0 / 0
13.12.2005, 13:17
    #33432862
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
13.12.2005, 13:47
    #33433005
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Евгений Путилин 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
13.12.2005, 13:49
    #33433012
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Timmиз одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true
можно. только что проверил. ms sql 2000, jsqlconnect.
...
Рейтинг: 0 / 0
13.12.2005, 13:51
    #33433021
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Timm
1) понял. из одного statement'a одновременно получить 2 result set'a - нельзя в случае autocommit = true. просто так никогда не писал :) если надо работать с несколькими result set'ами одновременно, всегда создавал соответствующее количество statement'ов.

Не уверен что правильно понял. Смысл в том что ты при выполнении любого statement'а, получиш commit для Connection. Со всеми вытекающими последтвиями.
Timm2) а что утечка то? одного finally вполне достаточно...
Хм. а что будет с Connection если у тебя в ps.close() вылетит exception? Лично ловился
...
Рейтинг: 0 / 0
13.12.2005, 13:58
    #33433046
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Евгений Путилин 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
13.12.2005, 14:50
    #33433283
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
13.12.2005, 15:02
    #33433345
nex
nex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Я конечно не знаю постановку задачи, но нельзя ли использовать вместо:

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

вот это:

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

?

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

--
nexus
...
Рейтинг: 0 / 0
13.12.2005, 15:23
    #33433441
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Евгений Путилин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
13.12.2005, 15:25
    #33433454
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Timm



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


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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
13.12.2005, 16:21
    #33433620
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
14.12.2005, 08:14
    #33434673
Liner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
А зачем столько 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
14.12.2005, 08:51
    #33434718
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
14.12.2005, 08:53
    #33434724
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
LinerА зачем столько try-catch чуть ли не для каждой операции, обнуллять объекты а след строчкой им же новые значения присваивать???

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

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

А.Грасоff™
...
Рейтинг: 0 / 0
14.12.2005, 11:13
    #33435068
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
14.12.2005, 11:29
    #33435127
Liner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
А.Грасо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
14.12.2005, 11:38
    #33435163
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
14.12.2005, 12:03
    #33435244
Liner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
14.12.2005, 17:06
    #33436294
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
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
14.12.2005, 17:22
    #33436353
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
LinerА зачем делать явный rollback если для используемого подключения выставлено setAutoCommit(false)? Это тоже самое что делать commit если выставлено setAutoCommit(true).а где про это сказано?
...
Рейтинг: 0 / 0
15.12.2005, 11:39
    #33437529
Sergey Karpenkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запросы
Я так понимаю вопрос стоит в выборке древовидных структур из БД. Если да то ваш вариант подходит плохо только потому что уровень вложености ограничен тут нужны рекурсивные алгоритмы. Вообщем хотелось бы знать зачем такая структура нужна. Да кстати если в качестве сервера БД используется Oracle или скажем PostgreSQL то может подумать над использованием запроса Connect by prior? Он вам всю структуру за один запрос нарисует. Если де нет то может попробовать другую структуру БД когда у листьев только указатель на корневую ноду и поле LEVEL которое показывает глубину вложенности?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / SQL-запросы / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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