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

Код: 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
13.07.2012, 19:27:35
    #37878851
Йуный джавистЪ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
Скорее всего тип столбцов char. Нужен varchar.
...
Рейтинг: 0 / 0
13.07.2012, 20:14:50
    #37878909
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
Йуный джавистЪСкорее всего тип столбцов char. Нужен varchar.даскуяле :)
строка после формата ещё не вставляется никуда
...
Рейтинг: 0 / 0
13.07.2012, 20:18:28
    #37878917
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
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
14.07.2012, 11:15:27
    #37879178
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
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
14.07.2012, 14:06:06
    #37879232
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
GorloPavelconnection.prepareStatement("insert ... (account_id, ..., country, city) values (?, ..., ?, ?)") и далее statement.setLong(1, 1)
только так
...
Рейтинг: 0 / 0
14.07.2012, 14:10:18
    #37879233
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
chpasha,

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

GorloPavelУ меня даже такого метода нет *.setLong...
поищи получше
...
Рейтинг: 0 / 0
14.07.2012, 14:35:39
    #37879242
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
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
14.07.2012, 14:40:20
    #37879245
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
Так что ли? Но в чем преимущество?
Код: java
1.
2.
PreparedStatement cmd =(PreparedStatement) hub_DB_Connection.prepareStatement("", new String[] {"1"});
cmd.execute();
...
Рейтинг: 0 / 0
14.07.2012, 14:49:22
    #37879251
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
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
14.07.2012, 15:03:17
    #37879259
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
chpasha,

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

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

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



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



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

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


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

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

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

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

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

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

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

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

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

connection pooling. Соединение мне нужно дважды. При авторизации и отключении клиента. Зачем мне держать подключение в пуле?
...
Рейтинг: 0 / 0
14.07.2012, 16:49:47
    #37879338
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
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
14.07.2012, 16:56:33
    #37879345
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
chpasha потом посетитель в крестики-нолики с сервером играет?
Да. Типо того. Операций с БД не производится. Т.е сейчас так. Подключился клиент... Объект сессии добавляется в synchronizedList(необходимо для связи с другими объектами-соединениями) ,вызвает synchronized функцию в которой делается select с drop table и если все нормально, то клиент играет в "крестики-нолики". Как только ему надоело играть, то он отключается... При отключении вызывается опять же synchronized функция которая пишет в лог. Далее объект удаляется из synchronizedList. При этом все работает довольно быстро и с одним соединением к СУБД. Плоха реализация?
...
Рейтинг: 0 / 0
14.07.2012, 16:58:28
    #37879346
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
Да... Соединение с СУБД создается при старте программы один раз и до конца ее работы. Так как же избавится от инъекций? Только через PrepareStatement?
...
Рейтинг: 0 / 0
14.07.2012, 17:01:23
    #37879347
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
GorloPavelПлоха реализация?ну если база нужна только для этого...но все равно не спортивно.
...
Рейтинг: 0 / 0
14.07.2012, 17:02:27
    #37879348
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бага Java или недостаток знаний?
GorloPavelТак как же избавится от инъекций? Только через PrepareStatement?проще всего так.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Бага Java или недостаток знаний? / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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