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

Код: java
1.
2.
3.
country="India";
city ="Pune";
String str=String.format("INSERT INTO server_connections(account_id,ip_address,version,direct_port,local_ip_address,mac_address,country,city) VALUES(%1s,'%2s','%3s',%4s,'%5s','%6s','%7s','%8s')",1, "1.1.1.1","3.0.2.9",3478,"192.168.0.2","",country,city);



В итоге к India и Pune добавляются пробелы!

INSERT INTO server_connections(account_id,ip_address,version,direct_port,local_ip_address,mac_address,country,city) VALUES(1,'1.1.1.1','3.0.2.9',3478,'192.168.0.2',' ',' India',' Pune')

В чем дело? Заранее огромное спасибо за ответы!
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37878851
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего тип столбцов char. Нужен varchar.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37878909
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪСкорее всего тип столбцов char. Нужен varchar.даскуяле :)
строка после формата ещё не вставляется никуда
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37878917
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax

вкратце - %1s и %1$s отличаются друг от друга

и почему не просто %s?
и почему String.format, а не StringBuilder?
и почему String.format, а не connection.prepareStatement("insert ... (account_id, ..., country, city) values (?, ..., ?, ?)") и далее statement.setLong(1, 1), statement.setString(7, "India"), statement.setString(8, "Pune")
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879178
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasoff.netGorloPavel,

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax

вкратце - %1s и %1$s отличаются друг от друга

и почему не просто %s?
и почему String.format, а не StringBuilder?
и почему String.format, а не connection.prepareStatement("insert ... (account_id, ..., country, city) values (?, ..., ?, ?)") и далее statement.setLong(1, 1), statement.setString(7, "India"), statement.setString(8, "Pune")

Помогло %s Хм... не совсем понял про... Я использую коннектор Mysql. И разве у StringBuilder есть format? Или вы предлагали сформировать строку запроса, а потом выполнить ее? Спасибо.

Код: java
1.
connection.prepareStatement("insert ... (account_id, ..., country, city) values (?, ..., ?, ?)") и далее statement.setLong(1, 1)
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879232
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelconnection.prepareStatement("insert ... (account_id, ..., country, city) values (?, ..., ?, ?)") и далее statement.setLong(1, 1)
только так
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879233
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Что только так? У меня даже такого метода нет *.setLong...
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879240
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelchpasha,
Что только так?
только так и можно делать инсерты, в которых участвуют параметры типа string.

GorloPavelУ меня даже такого метода нет *.setLong...
поищи получше
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879242
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Ок.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Connection hub_DB_Connection=null;

Class.forName("com.mysql.jdbc.Driver");

HUB_DB_URL= "jdbc:mysql://"+HUB_DB_HOST+"/"+HUB_DB_NAME+"?autoReconnect=true";
hub_DB_Connection = DriverManager.getConnection(HUB_DB_URL, HUB_USER_NAME, HUB_PASSWORD);
................................................


Statement command = hub_DB_Connection.createStatement();

command.нет_таких_методов



Используется mysql connector 5.1.1.8 . Я что-то делаю не так? Заранее огромное спасибо.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879245
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что ли? Но в чем преимущество?
Код: java
1.
2.
PreparedStatement cmd =(PreparedStatement) hub_DB_Connection.prepareStatement("", new String[] {"1"});
cmd.execute();
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879251
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelТак что ли? Но в чем преимущество?


автор
1) "Query is rewritten and compiled once by the database server"

If you don't use a prepared statement, the database server will have to parse, and compute an execution plan for the statement each time you run it. If you find that you'll run the same statement multiple times (with different parameters) then its worth preparing the statement once and resuing that prepared statement. If you are querying the database adhoc then there is probably little benifit to this.

2) "Protected against SQL injection"

This is an advantage you almost always want hence a good reason to use a PrepareStatement everytime. Its a consequence of having to parameterise the query but it does make running it a lot safer. The only time I can think of that this would not be useful is if you were allowing adhoc database queries; You might simply use the Statement object if you were prototyping the application and its quicker for you, or if the query contains no parameters
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879259
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Спасибо вам большое! Век живи - век учись!
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879264
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

И еще вопрос... Т.е правильнее будет сделать в самом начале один раз сохранив глобальную ссылку на объект...

Код: java
1.
cmd =(PreparedStatement) hub_DB_Connection.prepareStatement("...", new String[] {"1"});



Ну а потом каждый раз делать...
Код: java
1.
statement.setString(x, str);



Так?
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879277
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelchpasha,
Век живи - век учись!
судя по приведенным кускам кода, ты не представляешь себе, на сколько ты в начале пути ;)

GorloPavelИ еще вопрос... Т.е правильнее будет сделать в самом начале один раз сохранив глобальную ссылку на объект...
нет. так делать не стоит, поимеешь больше проблем, чем выгоды. главный смысл использования preparedstatement именно разруливание проблем с параметрами (и это уже не мало) плюс еще кое-чего. остальные упомянутые ранее плюшки можно получить только если у тебя есть повторяющееся действия. если например твой инсерт нужно в цикле несколько раз выполнить.


P.S. советую погуглить про connection pooling, spring-ioc , spring-jdbc, это для начала.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879280
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Т.е если это у меня делается в synchronized методе, а этот метод вызывается примерно из ~3000 потоков, то придется обойтись String.Format?
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879299
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelТ.е если это у меня делается в synchronized методе, а этот метод вызывается примерно из ~3000 потоков
если у тебя 3000 потоков натыкаются на один synchronized метод, то какой смысл в 3000 потоков? либо каждому потоку нужен свой коннект и свой statement либо потоки занимаются основной работой, а результаты их деятельности мы кладем пачками в базу некоторым количеством других потоков, гораздо меньшим 3000.

т.е. главное что? главное правильно организовать архитектуру. а многопоточность это вообще вещь в себе.

GorloPavel, то придется обойтись String.Format?
почти никогда. даже использование голого jdbc оправданно в довольно редких случаях.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879308
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

Ок. Мое приложение это TCP сервер и метод используется для авторизации. Помимо Insert-a перед ним выполняется Select. Он вызывается потоком один раз за всю его жизнь. Ранее было так, что в каждом потоке использовалось отдельное подключение к СУБД. Но возникала другая проблема... При практически одновременном подключении нескольких тысяч клиентов MYSQL сходил с ума и зависал...
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879323
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelchpasha,
Он вызывается потоком один раз за всю его жизнь.
это не важно. мы ведь не хотим авторизовать пользователя drop tables; ты пытаешься наступить здесь на грабли именуемые преждевременная оптимизация, т.е. сэкономить на спичках отказываясь от prepared statement.

GorloPavel Ранее было так, что в каждом потоке испо
льзовалось отдельное подключение к СУБД. Но возникала другая проблема... При практически одновременном подключении нескольких тысяч клиентов MYSQL сходил с ума и зависал...и тут мы добрались до темы connection pooling.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879328
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaGorloPavelchpasha,
Он вызывается потоком один раз за всю его жизнь.
это не важно. мы ведь не хотим авторизовать пользователя drop tables; ты пытаешься наступить здесь на грабли именуемые преждевременная оптимизация, т.е. сэкономить на спичках отказываясь от prepared statement.

GorloPavel Ранее было так, что в каждом потоке испо
льзовалось отдельное подключение к СУБД. Но возникала другая проблема... При практически одновременном подключении нескольких тысяч клиентов MYSQL сходил с ума и зависал...и тут мы добрались до темы connection pooling.

Не понял причем тут drop tables ? Разве можно удалить таблицу запросом вида select что-то from таблица where drop tables?

К тому же если использовать prepared statement, то мне придется каждый раз создавать объект?
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879329
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

connection pooling. Соединение мне нужно дважды. При авторизации и отключении клиента. Зачем мне держать подключение в пуле?
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879338
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelРазве можно удалить таблицу запросом вида select что-то from таблица where drop tables?


Код: sql
1.
2.
3.
select * from users a where a.source='%s'
%s = admin';drop table test;select '1
%s = admin' or '1'='1



GorloPavelК тому же если использовать prepared statement, то мне придется каждый раз создавать объект?
придется. и?


GorloPavelconnection pooling. Соединение мне нужно дважды. При авторизации и отключении клиента.
у тебя общение с базой происходит только во время авторизации? потом посетитель в крестики-нолики с сервером играет?

GorloPavelЗачем мне держать подключение в пуле?

потому что установка соединения дорогостоящая операция. а удержание соединения оборачивается тем, что коннектов на всех не хватает.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879345
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha потом посетитель в крестики-нолики с сервером играет?
Да. Типо того. Операций с БД не производится. Т.е сейчас так. Подключился клиент... Объект сессии добавляется в synchronizedList(необходимо для связи с другими объектами-соединениями) ,вызвает synchronized функцию в которой делается select с drop table и если все нормально, то клиент играет в "крестики-нолики". Как только ему надоело играть, то он отключается... При отключении вызывается опять же synchronized функция которая пишет в лог. Далее объект удаляется из synchronizedList. При этом все работает довольно быстро и с одним соединением к СУБД. Плоха реализация?
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879346
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да... Соединение с СУБД создается при старте программы один раз и до конца ее работы. Так как же избавится от инъекций? Только через PrepareStatement?
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879347
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelПлоха реализация?ну если база нужна только для этого...но все равно не спортивно.
...
Рейтинг: 0 / 0
Бага Java или недостаток знаний?
    #37879348
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelТак как же избавится от инъекций? Только через PrepareStatement?проще всего так.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Бага Java или недостаток знаний?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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