|
|
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Проблема: Обнаружили, что клиенты, которые вставляют свои данные во временные таблицы через GlassFish на Oracle при чтении этих данных видят данные, введённые другими пользователями. Вопрос такой: Как решить эту проблему? Пояснение: Есть множество соединений клиентов к серверу приложений GlassFish. А соединение Glassfish СУБД Oracle одно. И получается, что все клиенты работают как бы в одной сессии СУБД и видят данные других клиентов во временных табличках. На GlassFish тип соединения javax.sql.ConnectionPoolDataSource. Вроде, должно как бы новое соединение на каждого клинета создаваться, но не создаётся. Просто смысл временных таблиц теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 13:57:12 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
GlassFish тут не при чем. Есть стандартная практика для повышения производительности использовать пул соединений. Пул позволяет пере-использовать физические соединения, т.к. создание нового достаточно трудоёмкая операция. Естественно соединение работает в одной оракловой сессии. А нельзя ли время жизни таблицы к транзакции привязать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:09:59 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Сделать их транзакционными, а не сессионными? Скорее всего, нет. При Commit табличка будет очищаться. А если длинные сессии будут? Наверное, не хорошо это. А если хранимая процедура Oracle должна во временную табличку что-то написать, а клиент забрать это? А что нет нормально решения? Кто-нибудь с этим сталкивался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:18:14 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
А зачем тогда пул соединений нужен, если все через одно соединение лезут? Хотелось бы каждой сессии клиента по соединению сделать и всё. Можно так? Типа, подсоединился новый клиент - на соединение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:20:15 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Фактически, в моём случае временная табличка ничем не отличается от постоянной. Даже если клиент закрыть/открыть, то данные во временной табличке остаются, причём от всех пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:22:56 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Niky4000А зачем тогда пул соединений нужен, если все через одно соединение лезут? Значит у вас нагрузка такая, что одного соединения достаточно. Niky4000Хотелось бы каждой сессии клиента по соединению сделать и всё. Можно так? Типа, подсоединился новый клиент - на соединение. Попробуйте вместо DataSource.getConnection() использовать DataSource.getConnection(login, password). Только пул должен позволять это делать. Не все реализации позволяют. Возможно стоит перейти на пул из драйвера для оракла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:53:04 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
EntityManager у меня ConteinerManaged. Код: sql 1. 2. Persistence Unit: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Может быть проблема в ConteinerManaged EntityManager? Может быть надо сделать его BeanManaged и как-нибудь вручную получать новое соединение через EntityManagerFactory? Это так... идеи пока... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:57:36 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Что-то типа такого Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 15:00:54 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Сейчас попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 15:16:22 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Если сами говорите, что таблицы практически не отличаются от обычных - сделайте одну таблицу со всеми вашими полями + userId - показывайте, очищайте и т.д. с фильтрацией по каждому пользователю. Итого табличка одна, не надо думать как обойти стандартные механизмы, чтобы вставить непонятный костыль, но придется запросики править. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 15:23:11 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
oneHalf Если сами говорите, что таблицы практически не отличаются от обычных - сделайте одну таблицу со всеми вашими полями + userId - показывайте, очищайте и т.д. с фильтрацией по каждому пользователю. Итого табличка одна, не надо думать как обойти стандартные механизмы, чтобы вставить непонятный костыль, но придется запросики править. Мне кажется, это не очень хорошая идея. Можно конечно, но лучше бы как-то по-нормальному это сделать. Blazkowicz Вот такой код у меня: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Валится на em.persist(dt); Вот какое исключение: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 15:33:21 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 15:42:38 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Что-то не получается... Если раскоментировать //@PersistenceContext(unitName = "EMDebugPU") //private EntityManager em; И закоментировать init(), то всё работает - данные в таблице DebugTest появляются, а если через EntityManagerFactory, то не работает - данные читаются из базы, но в базу не пишутся. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 12:21:52 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Причём никаких исключений не возникает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 12:22:20 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Пробую вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Поменял persistent unit. Пробовал RESOURSE_LOCAL и JTA. Тоже ничего не выходит. Метод persist вызывается. Исключений нет. А в базе пусто! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 13:34:49 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
А вот так вот данные в БД попадают: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. При Container Management может быть только JTA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 13:50:29 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Niky4000, попробуй добавить: Код: java 1. Niky4000Исключений нет. Исключения где ловил? Дебагером из IDE? В логах на сервере точно ничего нет (<domain_path>\logs\server.log)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 13:55:38 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Ой! Кажется, я накосячил... Вот как надо: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. Забыл добавить транзакции. Их же тут надо упоминать в явном виде... А вот Log'и: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Теперь надо потестировать на предмет того будут ли разные клиенты с разных host'ов видеть чужие данные, которые записал во временную табличку другой клиент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 14:28:22 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Во блин! Дела! А разные клиенты с разных host'ов всё равно видят чужие данные! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 14:56:41 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Во временных табличках... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 14:57:06 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
Niky4000, Код: xml 1. 2. 3. value="1" и тогда пула не будет и новое соединение на каждого клиента создаваться будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 15:14:32 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
0FD, скорее все будут ждать пока соединение не освободится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 15:18:40 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
А... Ну, я вот так сделал: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Вроде работает. Выводится 3 в конце работы у разных клиентов. Этот тест иллюстрирует то, что я вставил что-то во временную табличку, потом за'commit'ил, ещё записал и за'commit'ил и вывел количество записей. Другой клиент тоже самое сделал и у него получилось 3 записи, а не 6. Вроде, работает. А вопрос у меня: А я сделал вот так: private void destroy_em(){ em.close(); emf.close(); } EntityManager, наверное, нужно закрывать. А нужно ли закрывать EntityManagerFactory каждый раз или не нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 15:24:13 |
|
||
|
Временные таблички и GlassFish
|
|||
|---|---|---|---|
|
#18+
ferc0FD, скорее все будут ждать пока соединение не освободится Да, кстати! А это же пул соединений, а действительно не будет ли такого? Типа пул соединений - это количество возможных одновременных соединений, следовательно, если сделать: <property name="eclipselink.jdbc.connections.max" value="1"/> То будет 1 доступное соединение и все остальные будут просто ждать пока оно не освободиться. Или не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2012, 15:26:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37827734&tid=2131634]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
66ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 308ms |
| total: | 504ms |

| 0 / 0 |
