Использование данных DataSource в нескольких сервлетах с инъекцией ресурсов

StackOverflow https://stackoverflow.com//questions/25084955

Вопрос

У меня есть генеракодицетагкод, который я хочу использовать в нескольких сервлетах.Мне не нравится идея указания:

@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;
.

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

Моя идея - объявить Singleton EJB, который затем можно объявить в каждом сервлете:

@Startup
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DataSources {  
    @Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
    private DataSource liveDataSource_;

    public synchronized Connection getLiveConnection() throws SQLException {
        return liveDataSource_.getConnection();
    }
}
.

Это разумный способ решения проблемы?Я чувствую, что это немного тяжело для чего-то, что я бы подумал, будет общим вопросом.

Это было полезно?

Решение

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

Другое решение было бы использовать @Resource (name="my mass") вместо поиска. Если все ваши сервлеты в одном веб-приложении, вы можете определить один Resource-Ref с My Mass My Mass в вашем web.xml и разрешать его к настоящему имени поиска только в этом месте.

Другие советы

Я бы сказал, что используя EJB только по этой причине, может быть немного слишком тяжелым, как вы писали.

Первый Большинство современных серверов приложений будут кэшировать этот поиск, поэтому он не будет таким дорогостоящим.

Второе - вы можете использовать @Resource (name="my mass"), так как Robert сказал, что будет использовать одинаковую ссылку на ресурс, что можно сопоставить с именем JNDI, используя функции сопоставления приложений.

В-третьих - вы можете использовать CDI для веб-модуля только в таком случае:

CREATE CREATE класс, который удерживает определение вашего датаазорса, как это:

public class Datasources {

    @Produces @Resource(name="jdbc/yourRef", lookup="yourJNDI")
    DataSource myDataSource;
}
.

а затем используйте IT-сервлеть с помощью ввода:

public class MyServlet extends HttpServlet {
    @Inject 
    private DataSource myDs;   
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top