powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и многопоточность
21 сообщений из 21, страница 1 из 1
JDBC и многопоточность
    #33614365
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
Здрасте, подскажите пожалуйста

если есть один объект Connection

и во многих потоках из него делаются Statement

то надо как-то синхронизацию из-за этого обеспечивать?
Или Statements будут работать независимо, не беспокоить друг друга?
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33614459
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обычно в таких случая делают пул соединений. Если работать с одним, то в общем случае синхронизировать надо.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33614612
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
А почему и что именно синхронизировать? Все операции с доступом к Statement? Вроде как выполнение запросов и выборка данных - все применяются к Statement. Или есть какие-то структуры на уровне Connection, которые разделяются?
Есть ли какие-нибудь статьи про это и примеры с пулом коннекций?
Спасибо!
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33614974
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема может быть в коде, который создает statement через соединение. В любом случае необходимость синхронизации зависит от реализации драйвера, и думаю она есть. В качестве пула соединений можно использовать Apache DBCP или c3p0 (искать на sourceforge.net). В чистом виде никогда не использовал, но c3p0 успешно работает как источник данных для Hibernate. К тому же имеет возможность восстанавливать разорваное соединение с БД. Некоторые люди и компании, страдающие синдромом "Invented not here" пишут свои пулы.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615023
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже в свое время задался подобным вопросом:

http://sql.ru/forum/actualthread.aspx?tid=265440#2385944

http://sql.ru/forum/actualthread.aspx?tid=267057#2401572

в приведенных ссылках есть ссылки на хорошие статьи про пул соединений
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615051
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У "правильного" JDBC драйвера объект Connection безопасен при использовании одновременно из нескольких потоков. Остальные объекты (начиная со Statement и его разновидностей) небезопасны (то есть доступ к ним должен быть из одного потока - в норме того, который их создает).

Тем не менее если вы надумаете пользоваться этим, это не будет хорошо. Производительность будет страдать тем больше, чем больше параллельных потоков будут использовать соединение. Поэтому используйте пулы! А лучше какой-нибудь ORM типа Hibernate.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615136
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
Спасибо, уважаемые.

Просто я так и сделал - по одному Connection - а в потоках Statement
у каждого и все работает , под нагрузкой испытывал - по 10,20,50 потоков одновременно - все нормально возвращается, то есть на практике глюков нет пока, но вот то-то гложет - вдруг я ошибаюсь, люди ведь пулы используют неспроста.
Statement, конечно, я безопасным не считаю и использую 1 Statement == 1 поток. То есть разделяю - conn.
Драйвер базы использую jconn2. Наверное про него еще надо почитать, раз это от драйвера зависимо.

Насчет производительности - у меня больше 16 потоков не будет по-любому (а реалистично - менее 10 одновременных подключений), поэтому imho ее должно хватить. Лишь бы данные не искажались!
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615338
Фотография T800
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J--Спасибо, уважаемые.

Просто я так и сделал - по одному Connection - а в потоках Statement
у каждого и все работает , под нагрузкой испытывал - по 10,20,50 потоков одновременно - все нормально возвращается, то есть на практике глюков нет пока, но вот то-то гложет - вдруг я ошибаюсь, люди ведь пулы используют неспроста.
Statement, конечно, я безопасным не считаю и использую 1 Statement == 1 поток. То есть разделяю - conn.
Драйвер базы использую jconn2. Наверное про него еще надо почитать, раз это от драйвера зависимо.

Насчет производительности - у меня больше 16 потоков не будет по-любому (а реалистично - менее 10 одновременных подключений), поэтому imho ее должно хватить. Лишь бы данные не искажались!

Могу добавить от себя, когда несколько потоков лезут в БД - тоже использовал
один Connection и несколько Statement..
То там меньше 10 потоков.. Так что пул для этого занятия - очень слишком.
(ЗЫ) Драйвер оракловский. Все фурычит без проблем.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615371
OU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OU
Гость
результат будет в первую очередь зависеть от двух вещей: RDBMS и driver.
К примеру, ms sql сервер сервер использует транзакции для выполнения sql комманд. В этом случае вы можете ислпользовать либо transaction isolation level или table hints для управленя concurrencies. Также, ms sql сервер предоставляет connection pool, который поддерживается native sql driver. В принципе, когда вы создаете новый экземпляр connection, то для каждого случая вам просто выдается уже существующий connection из connection pool. Другое дело, как driver будет поступать с connection в случае исключений, но это уже не имеет отнощения к concurrencies. Просмотрите документацию RDBMS и driver, там должно быть об этом сказано.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615455
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J--Здрасте, подскажите пожалуйста

если есть один объект Connection

и во многих потоках из него делаются Statement

то надо как-то синхронизацию из-за этого обеспечивать?
Или Statements будут работать независимо, не беспокоить друг друга?
если у тебя acutocommit==true то тогда используй пул соединений. Ипсользование одного COnnection чревато тем что операции по нему могут быть синхронными т.к. на уровне сервера запросы просто не будут распаралеливаться.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615464
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JDBC - это всего лишь набор интерфейсов, и если в документации нет каких-либо указаний насчет безопасности несихронизированного доступа к соединению, то следует использовать пул. А я думаю, что нет и не стоит полагаться на особенности драйвера по той простой причине, что завтра может появиться другой.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615543
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackWallJDBC - это всего лишь набор интерфейсов

Не только. Насчет многопоточности есть вполне определенные требования (спецификация):

автор9.2 Multi-threading
We require that all operations on all the java.sql objects be multi-thread safe and able to cope correctly with having several threads simultaneously calling the same object.
Some drivers may allow more concurrent execution than others. Developers can assume fully concurrent execution; if the driver requires some form of synchronization, it will provide it.
The only difference visible to the developer will be that applications will run with reduced concurrency.
For example, two Statements on the same Connection can be executed concurrently and their ResultSets can be processed concurrently (from the perspective of the developer). Some drivers will provide this full concurrency. Others may execute one statement and wait until it completes before sending the next.

Так что то, с чего началась тема, безопасно. Другое дело (как это и отмечено в приведенном мною фрагменте), что могут быть проблемы с производительностью.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615673
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
М.Голованов Вы меня более-менее успокоили.
А то я думал - не начала бы какая-нибудь лажа выдаваться из запросов.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33615695
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J--М.Голованов Вы меня более-менее успокоили.

Знание - сила (С) Большой умный медведь
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33616137
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим физически jdbc-драйвер позволяет разделять Connection между несколькими потоками. Мне вот только интересно, а как уважаемый all планирует управлять в такой ситуации транзакциями? :) Многопоточная транзакция - это конечно круто - но есть ли реальный смысл?
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33616205
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разве на один Connection одна транзакция?
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33616355
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Опять читаем спецификацию:

автор9.3 Transactions.
New JDBC connections are initially in “auto-commit” mode. This means that each statement is executed as a separate transaction at the database.
In order to execute several statements within a single transaction, you must first disable autocommit by calling Connection.setAutoCommit(false).
When auto-commit is disabled, the connection always has an implicit transaction associated with it. You can execute a Connection.commit to complete the transaction or a Connection.rollback to abort it. The commit or rollback will also start a new implicit transaction.
The exact semantics of transactions and their isolation levels depend on the underlying database.

Короче, работать с едиственным соединением имеет смысл только в режиме “auto-commit”.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33616378
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть если вы хотите обозначать конкретные явные транзакции в нескольких параллельных потоках, номер не пройдет. Даже если вы это сделаете, commit() будет фиксировать все, что запрошено к данному моменту во всех потоках. Точно так же rollback() будет откатывать все, что запрошено ук данному моменту во всех потоках.

Иначе говоря, если вы хотите использовать явные транзакции и управлять ими с помощью commit() / rollback(), используйте одно соединение на поток. И, как следствие, используйте пул. Его основной плюс - то, что каждое соединение, входящее в пул, входит в БД ровно 1 раз, а этот вход занимает довольно продолжительное время (создание буферов и прочая возня на стороне сервера БД). Если вы будете каждый раз создавать новое соединение в потоке, а по завершении конкретной операции его закрывать, будут потери производительности.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33616846
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял из приведенного текста что одна транзакция выдается на один Statement а не на один Connection.


Это и так понятно автору темы, что на каждый поток - свой Statement.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33616867
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kЯ так понял из приведенного текста что одна транзакция выдается на один Statement а не на один Connection.


Это и так понятно автору темы, что на каждый поток - свой Statement.
не, неправильно понял. это при autocommit=true каждый запрос - как одна транзакция. если же autocommit=false управление транзакцией ложится на connection.
...
Рейтинг: 0 / 0
JDBC и многопоточность
    #33619091
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я говорил про то что много-поточная транзация - это нонсенс. Зачем себе так жизнь усложнять мне совершенно не понятно. Чем пул соединений не устраивает?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и многопоточность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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