Чтение одного и того же ResultSet из нескольких потоков - PullRequest
1 голос
/ 27 марта 2010

В базе данных у меня есть таблица определений, которая читается из приложения один раз при запуске. Эта таблица определений редко изменяется, поэтому имеет смысл прочитать ее один раз и перезапускать приложение каждый раз, когда оно меняется.

Однако после того, как таблица прочитана (помещена в ResultSet), она будет прочитана несколькими обработчиками, работающими в своих собственных потоках.

Как вы предлагаете это сделать?

Моя идея состояла в том, чтобы заполнить CachedRowSet и затем создавать копию этого набора (с помощью метода createCopy ()) для каждого обработчика каждый раз, когда приходит новый запрос.

Как вы думаете, это мудро? Это предлагает хорошую производительность?

Спасибо.

Ответы [ 3 ]

1 голос
/ 27 марта 2010

Хорошо, если вы управляете доступом к resultSet и не хотите обновлять набор результатов до тех пор, пока не перезапустите приложение, тогда я бы предложил обернуть CachedRowSet в пользовательский класс. Один из возможных способов сделать это - иметь класс-оболочку, который является singleTon, и предоставить ему методы получения, чтобы другие потоки или классы могли получить к нему доступ. Таким образом вы устраняете необходимость делать копию и удаляете зависимость от реализации CachedRowSet. Создание копии может привести к ненужным накладным расходам. Представьте себе, как вы описали выше, если бы у вас было 1000 потоков, обращающихся к вашему набору результатов, вы бы вызывали createCopy () 1000 раз, создавая 1000 копий одного и того же набора результатов.

1 голос
/ 27 марта 2010

Возможно, вам лучше использовать шаблон синглтона. Это позволит вам создать один класс, к которому все ваши потоки смогут получить доступ к нужному объекту. Это также может позволить вам не закрывать приложение при внесении изменений. Один из способов сделать это - иметь класс, в котором вы получаете и устанавливаете методы для необходимой вам информации. И еще один класс, который выдаст ссылки на этот объект.

Класс, который выдает ссылки, может иметь приватный конструктор и метод getInstance, который будет возвращать ссылку на себя, чтобы гарантировать, что существует только одна. Это также даст вам некоторые другие возможности относительно того, что вы можете сделать, когда все изменится.

0 голосов
/ 30 марта 2010

Я думаю, что это шаблон для чтения таблицы конфигурации в статическую структуру данных (ConcurrentHashMap), а затем для потоков, чтобы найти ее.

Вы можете убедиться в отсутствии гонки записи при запуске, заполнив карту ссылок из Servlet.init() - она ​​гарантированно выполняется один раз для сервлета.

...