Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java: Не работают setXXX для установки значения PreparedStatement / 16 сообщений из 16, страница 1 из 1
11.10.2006, 19:10:41
    #34048590
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Есть код... ну, вот в таком упрощённом виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
...
        L2DatabaseFactory.getInstance();

        java.sql.Connection con =  null ;
         try 
        {
            con = L2DatabaseFactory.getInstance().getConnection();
            PreparedStatement statement = con.prepareStatement("SELECT login, email FROM accounts WHERE login=?");
            _log.config("Prepare statement "+statement);
            statement.setString( 1 , "balancer");
            ResultSet rset = statement.executeQuery();
             if (rset.next())
                _log.info("account exists -> "+rset.getString( 1 ) + ", "+rset.getString( 2 ));
             else 
                _log.info("Account not found");

            rset.close();
            statement.close();

            _log.info("statement executed ");

        }
...
Уже года два, как работал без глюков и в винде и в линуксе. (Это здоровый проект). Недавно под линуксовой машиной, ни с того ни с сего, методы setXXX перестали работать. Ошибок никаких. диагностики никакой, но или вообще ничего не находит, или находит результаты, отзывающиеся на пустые аргументы. Попытка записать в таком виде приводит к мысли, что расстановка параметров происходит не по порядковым номерам, а куда попало. Скажем, 2-й текстовый параметр пишется в 7-ю позицию, 1-й - в 6-ю. Часть полей пустых, в чцелочисленных полях записи БД оказываются умопомрачительные числа.

Попытка понять причины ни к чему не привела.

Переустановка mysql, java, jdbc-mysql-connect и c3p0 ни к чему не привела. Последние проверялись в нескольких версиях, а те, что работали исправно раньше, и новые, как бинарники, так и собранные из сорцов.

Есть мысли, куда копать?

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

Установить, что в этот момент менялось и обновлялось на сервере нереально... менялось всё (emerge -e world на Gentoo :) )
...
Рейтинг: 0 / 0
11.10.2006, 21:29:48
    #34048781
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
в линеечку поигрываем? :)
...
Рейтинг: 0 / 0
11.10.2006, 21:46:38
    #34048793
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
если предположить что этот ваш сервер работал все это время без глюков а затем внезапно стал глючить - проблема в самой БД, вдруг в нее как нибудь протиснуллись какие нибудь SQL-injections? (разумеется не через PreparedStatement т.к. через него это не возможно, а в другом месте проги, где использвались другие вещи)

PreparedStatement по моему использует тот порядок параметров который указывается...
...
Рейтинг: 0 / 0
11.10.2006, 22:32:30
    #34048831
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
unicornmirageв линеечку поигрываем? :)

Да. L2 Fortress.
...
Рейтинг: 0 / 0
11.10.2006, 22:34:36
    #34048837
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
>если предположить что этот ваш сервер работал все это время без глюков а затем внезапно стал глючить - проблема в самой БД, вдруг в нее как нибудь протиснуллись какие нибудь SQL-injections?

Все запросы из этой же таблицы "вручную" работают.

Более того, забыл упомянуть. Если параметр вписать не по setString/setInteger, а прямо в строку, вместо соответствующего "?", в т.ч. простым сложением - всё работает. Т.е. проблема именно в этих методах.

>PreparedStatement по моему использует тот порядок параметров который указывается...

Да, естественно. Но вот тут - что-то сломалось. Что - не представляю, так как, уже упоминал, переставил буквально всё :-/
...
Рейтинг: 0 / 0
12.10.2006, 10:38:35
    #34049425
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
надо посмотреть класс, который наследует интерфейс PreparedStatement, может какая нибудь кривая версия драйвера?
какая то странная ошибка на первый взгляд. нужно копать по методу дедукции :)
...
Рейтинг: 0 / 0
12.10.2006, 10:39:51
    #34049428
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
а если заменить все setString на setObject? или setBytes?
...
Рейтинг: 0 / 0
21.10.2006, 15:39:02
    #34071811
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Кажется, лыжи не едут.

Взял совсем другую машину, другая БД, другая версия mysql, и, вообще, amd64, в то время, как топик родился на x86.

Слепил отдельный тестик.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            String userName = "-----";
            String password = "------";
            String url = "jdbc:mysql://localhost/WWW";
             Class .forName ("com.mysql.jdbc.Driver").newInstance ();
            conn = DriverManager.getConnection (url, userName, password);
            System.out.println ("Database connection established");

            PreparedStatement s = conn.prepareStatement("SELECT id, value FROM hts_data_title WHERE id = ?");
            s.setString( 1 , "тут-значение-ключа");
            s.executeQuery();
            ResultSet rs = s.getResultSet ();
             int  count =  0 ;
             while  (rs.next () && (count <  5 ))
            {
                String id = rs.getString ("id");
                String val = rs.getString ("value");
                System.out.println("id = " + id + ", value = " + val);
                ++count;
            }
            rs.close ();
            s.close ();
            System.out.println (count + " rows were retrieved");

В таком виде, независимо то того что пишем по setString (или setObject), т.е. указывать в качестве ключа можно любую абракадабру, находится одна строка (совершенно левая, но всегда одна и та же.)

Если setXXX не использовать - ругается, что не задан параметр.

Если setXXX не использовать, а значение ключа вписать вместо "?" в строке запроса - всё находится прекрасно.

Пробовал готовый бинарный mysql-connector-java-3.1.12-bin.jar, пробовал самосборный из сорцов jdbc-mysql-3.1.10, результат один и тот же...
...
Рейтинг: 0 / 0
21.10.2006, 15:50:32
    #34071820
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Есть ли какие-нибудь утититы трассировки для MySQL? Чтобы посмотреть, какой именно запрос
выполняется на стороне БД.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
21.10.2006, 16:00:36
    #34071831
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Denis Popov
Есть ли какие-нибудь утититы трассировки для MySQL? Чтобы посмотреть, какой именно запрос
выполняется на стороне БД.


Мне таковые неизвестны :-/

Хотя на тестовой машине сейчас попробую что-нибудь придумать.
...
Рейтинг: 0 / 0
21.10.2006, 16:17:31
    #34071847
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Вот, штатный лог mysql на запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
/usr/sbin/mysqld, Version:  4 . 1 . 21 -log. started with:
Tcp port:  3306   Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
 061021   16 : 06 : 06         1  Connect     username@localhost on WWW
                       1  Query       SET NAMES utf8
                       1  Query       SET character_set_results = NULL
                       1  Query       SHOW VARIABLES
                       1  Query       SHOW COLLATION
                       1  Query       SET autocommit= 1 
                       1  Prepare     [ 1 ] SELECT id, value FROM hts_data_title WHERE id = ?
                       1  Execute     [ 1 ] SELECT id, value FROM hts_data_title WHERE id = ''
                       1  Quit

Т.е. видно, что прописывается пустая строка :-/

Дальше - больше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                        PreparedStatement s = conn.prepareStatement("SELECT id, user_id, type, title FROM 
job WHERE id = ? AND user_id = ? AND type= ? AND time = ? AND timing = ? ");
                        s.setInt( 1 ,  117 );
                        s.setInt( 2 ,  0 );
                        s.setString( 3 , "vacancy");
                        s.setInt( 4 ,  1153232406 );
                        s.setString( 5 , "fulltime");
                        s.executeQuery();
                        ResultSet rs = s.getResultSet ();


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 061021   16 : 14 : 19        25  Connect     username@localhost on WWW
                      25  Query       SET NAMES utf8
                      25  Query       SET character_set_results = NULL
                      25  Query       SHOW VARIABLES
                      25  Query       SHOW COLLATION
                      25  Query       SET autocommit= 1 
                      25  Prepare     [ 1 ] SELECT id, user_id, type, title FROM job WHERE id = ? AND user_id
= ? AND type= ? AND time = ? AND timing = ?
                      25  Execute     [ 1 ] SELECT id, user_id, type, title FROM aviaport_job WHERE id =  196864  AND use
r_id =  16580611  AND type= '\0.\0' AND time =  117  AND timing = ''
                      25  Quit

Как видно - та самая путаница порядка аргументов, про которую я говорил. Напомню, что это совсем другая машина, другой набор софта. И на обоих машинах всё остальное с mysql работает отлично (консоль, PHP).

Я в недоумении :-/
...
Рейтинг: 0 / 0
21.10.2006, 16:18:32
    #34071848
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
BalancerМне таковые неизвестны :-/
Думаю, поиск даст какие-то результаты, даже на местном форуме мо MySQL:

/topic/192130

http://www.botik.ru/~rldp/mysql/mysqladm/glava06.htm#Making_trace_files
...
Рейтинг: 0 / 0
21.10.2006, 16:26:46
    #34071856
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Извиняюсь, успел раньше послать сообщение, прежде чем увидел последнее письмо:)

На странице MySQL Connector/J сказано,что "MySQL Connector/J 3.1 is the old production-ready version of the driver", рядом ссылка на MySQL Connector/J 5.0. Может попробовать с ним?
...
Рейтинг: 0 / 0
21.10.2006, 16:39:17
    #34071866
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Denis PopovНа странице MySQL Connector/J сказано,что "MySQL Connector/J 3.1 is the old production-ready version of the driver", рядом ссылка на MySQL Connector/J 5.0. Может попробовать с ним?

Обновил. Абсолютно такой же запрос, как в предыдущем сообщении :-/ Т.е. перепутан порядок аргументов.
...
Рейтинг: 0 / 0
21.10.2006, 16:42:58
    #34071869
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Перед executeQuery добавил
Код: plaintext
1.
System.out.println("ps="+s.toString());
Пишет:

Код: plaintext
1.
ps=com.mysql.jdbc.ServerPreparedStatement[ 1 ] - SELECT id, user_id, type, title FROM job WHERE id =  117  AND user_id =  0  AND type= 'vacancy' AND time =  1153232406  AND timing = 'fulltime'
Т.е. на этом уровне - всё ок.
...
Рейтинг: 0 / 0
21.10.2006, 16:45:42
    #34071873
Balancer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java: Не работают setXXX для установки значения PreparedStatement
Ура!!!
Код: plaintext
1.
useServerPrepStmts=false

к параметрам uri БД и всё заработало!

Спасибо http://community.livejournal.com/ru_java/329335.html?thread=3000439#t3000439 и http://forums.mysql.com/read.php?39,59076,59277#msg-59277
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java: Не работают setXXX для установки значения PreparedStatement / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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