|
|
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Происходит совсем непонятная для меня вещь. Код: java 1. 2. 3. В итоге к 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') В чем дело? Заранее огромное спасибо за ответы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2012, 18:20:24 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Скорее всего тип столбцов char. Нужен varchar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2012, 19:27:35 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪСкорее всего тип столбцов char. Нужен varchar.даскуяле :) строка после формата ещё не вставляется никуда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2012, 20:14:50 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
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") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2012, 20:18:28 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 11:15:27 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelconnection.prepareStatement("insert ... (account_id, ..., country, city) values (?, ..., ?, ?)") и далее statement.setLong(1, 1) только так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 14:06:06 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, Что только так? У меня даже такого метода нет *.setLong... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 14:10:18 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelchpasha, Что только так? только так и можно делать инсерты, в которых участвуют параметры типа string. GorloPavelУ меня даже такого метода нет *.setLong... поищи получше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 14:23:34 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, Ок. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Используется mysql connector 5.1.1.8 . Я что-то делаю не так? Заранее огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 14:35:39 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Так что ли? Но в чем преимущество? Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 14:40:20 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 14:49:22 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, Спасибо вам большое! Век живи - век учись! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 15:03:17 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, И еще вопрос... Т.е правильнее будет сделать в самом начале один раз сохранив глобальную ссылку на объект... Код: java 1. Ну а потом каждый раз делать... Код: java 1. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 15:07:37 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelchpasha, Век живи - век учись! судя по приведенным кускам кода, ты не представляешь себе, на сколько ты в начале пути ;) GorloPavelИ еще вопрос... Т.е правильнее будет сделать в самом начале один раз сохранив глобальную ссылку на объект... нет. так делать не стоит, поимеешь больше проблем, чем выгоды. главный смысл использования preparedstatement именно разруливание проблем с параметрами (и это уже не мало) плюс еще кое-чего. остальные упомянутые ранее плюшки можно получить только если у тебя есть повторяющееся действия. если например твой инсерт нужно в цикле несколько раз выполнить. P.S. советую погуглить про connection pooling, spring-ioc , spring-jdbc, это для начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 15:39:05 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, Т.е если это у меня делается в synchronized методе, а этот метод вызывается примерно из ~3000 потоков, то придется обойтись String.Format? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 15:45:12 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelТ.е если это у меня делается в synchronized методе, а этот метод вызывается примерно из ~3000 потоков если у тебя 3000 потоков натыкаются на один synchronized метод, то какой смысл в 3000 потоков? либо каждому потоку нужен свой коннект и свой statement либо потоки занимаются основной работой, а результаты их деятельности мы кладем пачками в базу некоторым количеством других потоков, гораздо меньшим 3000. т.е. главное что? главное правильно организовать архитектуру. а многопоточность это вообще вещь в себе. GorloPavel, то придется обойтись String.Format? почти никогда. даже использование голого jdbc оправданно в довольно редких случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:02:01 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, Ок. Мое приложение это TCP сервер и метод используется для авторизации. Помимо Insert-a перед ним выполняется Select. Он вызывается потоком один раз за всю его жизнь. Ранее было так, что в каждом потоке использовалось отдельное подключение к СУБД. Но возникала другая проблема... При практически одновременном подключении нескольких тысяч клиентов MYSQL сходил с ума и зависал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:17:52 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelchpasha, Он вызывается потоком один раз за всю его жизнь. это не важно. мы ведь не хотим авторизовать пользователя drop tables; ты пытаешься наступить здесь на грабли именуемые преждевременная оптимизация, т.е. сэкономить на спичках отказываясь от prepared statement. GorloPavel Ранее было так, что в каждом потоке испо льзовалось отдельное подключение к СУБД. Но возникала другая проблема... При практически одновременном подключении нескольких тысяч клиентов MYSQL сходил с ума и зависал...и тут мы добрались до темы connection pooling. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:30:08 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpashaGorloPavelchpasha, Он вызывается потоком один раз за всю его жизнь. это не важно. мы ведь не хотим авторизовать пользователя drop tables; ты пытаешься наступить здесь на грабли именуемые преждевременная оптимизация, т.е. сэкономить на спичках отказываясь от prepared statement. GorloPavel Ранее было так, что в каждом потоке испо льзовалось отдельное подключение к СУБД. Но возникала другая проблема... При практически одновременном подключении нескольких тысяч клиентов MYSQL сходил с ума и зависал...и тут мы добрались до темы connection pooling. Не понял причем тут drop tables ? Разве можно удалить таблицу запросом вида select что-то from таблица where drop tables? К тому же если использовать prepared statement, то мне придется каждый раз создавать объект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:34:37 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, connection pooling. Соединение мне нужно дважды. При авторизации и отключении клиента. Зачем мне держать подключение в пуле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:36:08 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelРазве можно удалить таблицу запросом вида select что-то from таблица where drop tables? Код: sql 1. 2. 3. GorloPavelК тому же если использовать prepared statement, то мне придется каждый раз создавать объект? придется. и? GorloPavelconnection pooling. Соединение мне нужно дважды. При авторизации и отключении клиента. у тебя общение с базой происходит только во время авторизации? потом посетитель в крестики-нолики с сервером играет? GorloPavelЗачем мне держать подключение в пуле? потому что установка соединения дорогостоящая операция. а удержание соединения оборачивается тем, что коннектов на всех не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:49:47 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha потом посетитель в крестики-нолики с сервером играет? Да. Типо того. Операций с БД не производится. Т.е сейчас так. Подключился клиент... Объект сессии добавляется в synchronizedList(необходимо для связи с другими объектами-соединениями) ,вызвает synchronized функцию в которой делается select с drop table и если все нормально, то клиент играет в "крестики-нолики". Как только ему надоело играть, то он отключается... При отключении вызывается опять же synchronized функция которая пишет в лог. Далее объект удаляется из synchronizedList. При этом все работает довольно быстро и с одним соединением к СУБД. Плоха реализация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:56:33 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Да... Соединение с СУБД создается при старте программы один раз и до конца ее работы. Так как же избавится от инъекций? Только через PrepareStatement? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 16:58:28 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelПлоха реализация?ну если база нужна только для этого...но все равно не спортивно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 17:01:23 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelТак как же избавится от инъекций? Только через PrepareStatement?проще всего так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 17:02:27 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpashaGorloPavelТак как же избавится от инъекций? Только через PrepareStatement?проще всего так. А что мешает вставить в statement.setString(1, "admin';drop table test;select '1")? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 17:05:46 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelА что мешает вставить в statement.setString(1, "admin';drop table test;select '1")? действительно, что мешает? попробуй ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 18:23:36 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpasha, Попробовал! Еще раз спасибО! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 18:42:01 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelИли вы предлагали сформировать строку запросане. я ниче не предлагаю. я показываю направление, или задаю вопросы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2012, 22:23:11 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Начал использовать PreparedStatement и сервер упал в Out of memory :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2012, 04:16:41 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelНачал использовать PreparedStatement и сервер упал в Out of memory :( Скорее всего не закрываете всё что нужно. Слишком много разных SQL операций на один метод, поэтому вам сложно проконтролировтаь все закрываемые ресурсы в одном методе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2012, 10:41:48 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
GorloPavelНачал использовать PreparedStatement и сервер упал в Out of memory :( возьми spring-jdbc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 10:42:03 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
Penkov VladimirGorloPavelНачал использовать PreparedStatement и сервер упал в Out of memory :( возьми spring-jdbcили jdbi, что ещё приятнее ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 22:09:43 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
chpashaGorloPavelchpasha, Век живи - век учись! судя по приведенным кускам кода, ты не представляешь себе, на сколько ты в начале пути ;) GorloPavelИ еще вопрос... Т.е правильнее будет сделать в самом начале один раз сохранив глобальную ссылку на объект... нет. так делать не стоит, поимеешь больше проблем, чем выгоды. главный смысл использования preparedstatement именно разруливание проблем с параметрами (и это уже не мало) плюс еще кое-чего. остальные упомянутые ранее плюшки можно получить только если у тебя есть повторяющееся действия. если например твой инсерт нужно в цикле несколько раз выполнить. P.S. советую погуглить про connection pooling, spring-ioc , spring-jdbc, это для начала. А если селекты делать со связанными переменными, то выборка происходит обычно быстрее. Только бывает в жизни всякое, вот у нас, после обновления версии Оракла, если не ошибаюсь, что-то начудачили, и уже год, как все запросы в моих приложениях, переделаны без использования связанных переменных, потому-что так работает быстрее, как бы странно это ни звучало. Админы представления не имеют, что с этим делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 14:23:41 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
XDiaBLoАдмины представления не имеют, что с этим делать. - так оно всегда и бывает. когда никто не знает в чем дело, зачастую, решается абы как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 14:39:01 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczXDiaBLoАдмины представления не имеют, что с этим делать. - так оно всегда и бывает. когда никто не знает в чем дело, зачастую, решается абы как. У меня были чёткие указания от начальника. Убрать использование связанных переменных. Решать проблему, задача мне не ставилась. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 14:40:36 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
XDiaBLoА если селекты делать со связанными переменными, то выборка происходит обычно быстрее. Только бывает в жизни всякое, вот у нас, после обновления версии Оракла, если не ошибаюсь, что-то начудачили, и уже год, как все запросы в моих приложениях, переделаны без использования связанных переменных, потому-что так работает быстрее, как бы странно это ни звучало. Админы представления не имеют, что с этим делать. Аналогично влетел при обновлении оракла у одного заказчика (админ там ... как бы сказать... самоучка предпенсионного возраста). Если количество запросов относительно невелико, но они "тяжелые", то затраты на prepare Statment несущественны. А количество открытых курсоров в оракле смотрел, которые соответствуют запросам а-ля executeSql("select filed from table") ? Не напрягает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 16:12:55 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
По поводу PreparedStatement. У меня был случай, когда НЕ prepared запрос выполнялся за секунды, а Prepared - оооочень долго (по 10 минут ждал). MS SQL Server 2008 + jtds. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 17:45:45 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
sanBezXDiaBLoА если селекты делать со связанными переменными, то выборка происходит обычно быстрее. Только бывает в жизни всякое, вот у нас, после обновления версии Оракла, если не ошибаюсь, что-то начудачили, и уже год, как все запросы в моих приложениях, переделаны без использования связанных переменных, потому-что так работает быстрее, как бы странно это ни звучало. Админы представления не имеют, что с этим делать. Аналогично влетел при обновлении оракла у одного заказчика (админ там ... как бы сказать... самоучка предпенсионного возраста). Если количество запросов относительно невелико, но они "тяжелые", то затраты на prepare Statment несущественны. А количество открытых курсоров в оракле смотрел, которые соответствуют запросам а-ля executeSql("select filed from table") ? Не напрягает? Ну да, вроде как раз что-то такое было, куча каких-то левых запросов возникало, пока не убрали связанные переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2012, 07:09:48 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
LeonidvПо поводу PreparedStatement. У меня был случай, когда НЕ prepared запрос выполнялся за секунды, а Prepared - оооочень долго (по 10 минут ждал). MS SQL Server 2008 + jtds. Точно такой случай у нас с Ораклом вышел. Отчего я и убрал связанные переменные из программ. Хотя когда-то вводил с совершенно противоположными целями, для ускорения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2012, 07:10:52 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
LeonidvПо поводу PreparedStatement. У меня был случай, когда НЕ prepared запрос выполнялся за секунды, а Prepared - оооочень долго (по 10 минут ждал). MS SQL Server 2008 + jtds. Разные запросы, поэтому и выполняются по разному. Для Код: sql 1. и партаметром "abc", эквивалентный SQL Код: sql 1. С MS SQL проблема известная и легко излечимая. Java пользует unicode, и драйвер отправляет значения параметров как NVARCHAR. Если в запросе сравнивается поле CHAR/VARCHAR с значением из параметра, то сервер по тихому делает неявное преобразование. Только не параметра к типу поля, а наоборот. Оптимизатор индекса для Unicode значений не находит ( есть только для ASCII ) и сканирует всю таблицу. Лечится переводом всех строк в базе к Unicode ( NCHAR/NVARCHAR ), принудительным CAST в запросе или параметром соединения для передачи всех строковых параметров как ASCII. Безотносительно к PreparedStatement, с типами надо обращаться аккуратно, на те же проблемы легко нарваться и просто в SQL запросе или хранимой процедуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2012, 07:02:46 |
|
||
|
Бага Java или недостаток знаний?
|
|||
|---|---|---|---|
|
#18+
пролетевшийJava пользует unicode, и драйвер отправляет значения параметров как NVARCHAR. Если в запросе сравнивается поле CHAR/VARCHAR с значением из параметра, то сервер по тихому делает неявное преобразование. Только не параметра к типу поля, а наоборот. Оптимизатор индекса для Unicode значений не находит ( есть только для ASCII ) и сканирует всю таблицу. Лечится переводом всех строк в базе к Unicode ( NCHAR/NVARCHAR ), принудительным CAST в запросе или параметром соединения для передачи всех строковых параметров как ASCII. Я подсоединялся к сессии и явно видел что не работает индекс по дате. В маппинге было java.util.Date, в оракле поле типа Date. Маппинг топлинка. Не могу понять, как тогда в принципе заставить это работать с датой? Не подскажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2012, 10:09:06 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2131336]: |
0ms |
get settings: |
16ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
19ms |
get forum data: |
4ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
| others: | 356ms |
| total: | 570ms |

| 0 / 0 |
