powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java: Не работают setXXX для установки значения PreparedStatement
16 сообщений из 16, страница 1 из 1
Java: Не работают setXXX для установки значения PreparedStatement
    #34048590
Balancer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть код... ну, вот в таком упрощённом виде:
Код: 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
Java: Не работают setXXX для установки значения PreparedStatement
    #34048781
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в линеечку поигрываем? :)
...
Рейтинг: 0 / 0
Java: Не работают setXXX для установки значения PreparedStatement
    #34048793
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если предположить что этот ваш сервер работал все это время без глюков а затем внезапно стал глючить - проблема в самой БД, вдруг в нее как нибудь протиснуллись какие нибудь SQL-injections? (разумеется не через PreparedStatement т.к. через него это не возможно, а в другом месте проги, где использвались другие вещи)

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

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

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

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

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

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

Взял совсем другую машину, другая БД, другая версия 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
Java: Не работают setXXX для установки значения PreparedStatement
    #34071820
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли какие-нибудь утититы трассировки для MySQL? Чтобы посмотреть, какой именно запрос
выполняется на стороне БД.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Java: Не работают setXXX для установки значения PreparedStatement
    #34071831
Balancer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
Есть ли какие-нибудь утититы трассировки для MySQL? Чтобы посмотреть, какой именно запрос
выполняется на стороне БД.


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

Хотя на тестовой машине сейчас попробую что-нибудь придумать.
...
Рейтинг: 0 / 0
Java: Не работают setXXX для установки значения PreparedStatement
    #34071847
Balancer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, штатный лог 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
Java: Не работают setXXX для установки значения PreparedStatement
    #34071848
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BalancerМне таковые неизвестны :-/
Думаю, поиск даст какие-то результаты, даже на местном форуме мо MySQL:

/topic/192130

http://www.botik.ru/~rldp/mysql/mysqladm/glava06.htm#Making_trace_files
...
Рейтинг: 0 / 0
Java: Не работают setXXX для установки значения PreparedStatement
    #34071856
Фотография 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
Java: Не работают setXXX для установки значения PreparedStatement
    #34071866
Balancer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Java: Не работают setXXX для установки значения PreparedStatement
    #34071869
Balancer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перед 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
Java: Не работают setXXX для установки значения PreparedStatement
    #34071873
Balancer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура!!!
Код: 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
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java: Не работают setXXX для установки значения PreparedStatement
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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