|
|
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Здрасте, подскажите пожалуйста если есть один объект Connection и во многих потоках из него делаются Statement то надо как-то синхронизацию из-за этого обеспечивать? Или Statements будут работать независимо, не беспокоить друг друга? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 13:47 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Обычно в таких случая делают пул соединений. Если работать с одним, то в общем случае синхронизировать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 14:14 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
А почему и что именно синхронизировать? Все операции с доступом к Statement? Вроде как выполнение запросов и выборка данных - все применяются к Statement. Или есть какие-то структуры на уровне Connection, которые разделяются? Есть ли какие-нибудь статьи про это и примеры с пулом коннекций? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 14:57 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Проблема может быть в коде, который создает statement через соединение. В любом случае необходимость синхронизации зависит от реализации драйвера, и думаю она есть. В качестве пула соединений можно использовать Apache DBCP или c3p0 (искать на sourceforge.net). В чистом виде никогда не использовал, но c3p0 успешно работает как источник данных для Hibernate. К тому же имеет возможность восстанавливать разорваное соединение с БД. Некоторые люди и компании, страдающие синдромом "Invented not here" пишут свои пулы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 16:57 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
я тоже в свое время задался подобным вопросом: http://sql.ru/forum/actualthread.aspx?tid=265440#2385944 http://sql.ru/forum/actualthread.aspx?tid=267057#2401572 в приведенных ссылках есть ссылки на хорошие статьи про пул соединений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 17:10 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
У "правильного" JDBC драйвера объект Connection безопасен при использовании одновременно из нескольких потоков. Остальные объекты (начиная со Statement и его разновидностей) небезопасны (то есть доступ к ним должен быть из одного потока - в норме того, который их создает). Тем не менее если вы надумаете пользоваться этим, это не будет хорошо. Производительность будет страдать тем больше, чем больше параллельных потоков будут использовать соединение. Поэтому используйте пулы! А лучше какой-нибудь ORM типа Hibernate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 17:18 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Спасибо, уважаемые. Просто я так и сделал - по одному Connection - а в потоках Statement у каждого и все работает , под нагрузкой испытывал - по 10,20,50 потоков одновременно - все нормально возвращается, то есть на практике глюков нет пока, но вот то-то гложет - вдруг я ошибаюсь, люди ведь пулы используют неспроста. Statement, конечно, я безопасным не считаю и использую 1 Statement == 1 поток. То есть разделяю - conn. Драйвер базы использую jconn2. Наверное про него еще надо почитать, раз это от драйвера зависимо. Насчет производительности - у меня больше 16 потоков не будет по-любому (а реалистично - менее 10 одновременных подключений), поэтому imho ее должно хватить. Лишь бы данные не искажались! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 17:37 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
J--Спасибо, уважаемые. Просто я так и сделал - по одному Connection - а в потоках Statement у каждого и все работает , под нагрузкой испытывал - по 10,20,50 потоков одновременно - все нормально возвращается, то есть на практике глюков нет пока, но вот то-то гложет - вдруг я ошибаюсь, люди ведь пулы используют неспроста. Statement, конечно, я безопасным не считаю и использую 1 Statement == 1 поток. То есть разделяю - conn. Драйвер базы использую jconn2. Наверное про него еще надо почитать, раз это от драйвера зависимо. Насчет производительности - у меня больше 16 потоков не будет по-любому (а реалистично - менее 10 одновременных подключений), поэтому imho ее должно хватить. Лишь бы данные не искажались! Могу добавить от себя, когда несколько потоков лезут в БД - тоже использовал один Connection и несколько Statement.. То там меньше 10 потоков.. Так что пул для этого занятия - очень слишком. (ЗЫ) Драйвер оракловский. Все фурычит без проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 18:36 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
результат будет в первую очередь зависеть от двух вещей: 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, там должно быть об этом сказано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 18:55 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
J--Здрасте, подскажите пожалуйста если есть один объект Connection и во многих потоках из него делаются Statement то надо как-то синхронизацию из-за этого обеспечивать? Или Statements будут работать независимо, не беспокоить друг друга? если у тебя acutocommit==true то тогда используй пул соединений. Ипсользование одного COnnection чревато тем что операции по нему могут быть синхронными т.к. на уровне сервера запросы просто не будут распаралеливаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 19:27 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
JDBC - это всего лишь набор интерфейсов, и если в документации нет каких-либо указаний насчет безопасности несихронизированного доступа к соединению, то следует использовать пул. А я думаю, что нет и не стоит полагаться на особенности драйвера по той простой причине, что завтра может появиться другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 19:32 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
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. Так что то, с чего началась тема, безопасно. Другое дело (как это и отмечено в приведенном мною фрагменте), что могут быть проблемы с производительностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 20:46 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
М.Голованов Вы меня более-менее успокоили. А то я думал - не начала бы какая-нибудь лажа выдаваться из запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 22:25 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
J--М.Голованов Вы меня более-менее успокоили. Знание - сила (С) Большой умный медведь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 22:40 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Допустим физически jdbc-драйвер позволяет разделять Connection между несколькими потоками. Мне вот только интересно, а как уважаемый all планирует управлять в такой ситуации транзакциями? :) Многопоточная транзакция - это конечно круто - но есть ли реальный смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 09:48 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
а разве на один Connection одна транзакция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 10:08 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Да. Опять читаем спецификацию: автор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”. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 10:45 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
То есть если вы хотите обозначать конкретные явные транзакции в нескольких параллельных потоках, номер не пройдет. Даже если вы это сделаете, commit() будет фиксировать все, что запрошено к данному моменту во всех потоках. Точно так же rollback() будет откатывать все, что запрошено ук данному моменту во всех потоках. Иначе говоря, если вы хотите использовать явные транзакции и управлять ими с помощью commit() / rollback(), используйте одно соединение на поток. И, как следствие, используйте пул. Его основной плюс - то, что каждое соединение, входящее в пул, входит в БД ровно 1 раз, а этот вход занимает довольно продолжительное время (создание буферов и прочая возня на стороне сервера БД). Если вы будете каждый раз создавать новое соединение в потоке, а по завершении конкретной операции его закрывать, будут потери производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 10:51 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
Я так понял из приведенного текста что одна транзакция выдается на один Statement а не на один Connection. Это и так понятно автору темы, что на каждый поток - свой Statement. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 12:27 |
|
||
|
JDBC и многопоточность
|
|||
|---|---|---|---|
|
#18+
alex_kЯ так понял из приведенного текста что одна транзакция выдается на один Statement а не на один Connection. Это и так понятно автору темы, что на каждый поток - свой Statement. не, неправильно понял. это при autocommit=true каждый запрос - как одна транзакция. если же autocommit=false управление транзакцией ложится на connection. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2006, 12:31 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=59&tid=2149824]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 477ms |

| 0 / 0 |
