2013-03-11 3 views
0

Я разрабатываю небольшое веб-приложение с JSP, для этого приложения требуется подключение к базе данных, которое я предоставляю сервлетом.Можно ли объявить глобальную переменную, чтобы ее можно было использовать из каждого класса в JSP?

Проблема в том, что все файлы на сервере могут использовать этот класс для доступа к db, не создавая при каждом новом подключении, ведь в каждом файле я бы создал новый объект Database и новое соединение будет устанавливаться каждый раз.

Есть ли способ избежать этого, возможно, объявить глобальный объект, такой как session и request, чтобы он был инициализирован только один раз, а затем использовался всеми моими файлами JSP?

Thanks

+0

Я бы рекомендовал исследовать шаблон [Singleton pattern] (http://en.wikipedia.org/wiki/Singleton_pattern) и объединение пулов DB ... Также , работа с соединениями DB на уровне JSP - это то, что я пытался бы избежать любой ценой. JSP должен быть только для отображения, ИМХО. – ppeterka

+2

Возможно, пул подключения к базе данных будет уместен? – vikingsteve

+0

объект singleton для соединения с БД будет лучшей идеей, создайте объект в контексте вашего приложения. –

ответ

4

Зачем вам это нужно? Оба решения - неправильный путь.

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

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

Ваше приложение будет масштабироваться лучше и не будет рисковать потоками.

+0

В какой библиотеке вы предлагаете мне использовать? Я видел DBPool, вы предлагаете использовать какую-то другую библиотеку? – BackSlash

+0

Пул соединений с базой данных Apache Commons широко используется: http://commons.apache.org/proper/commons-dbcp// – duffymo

2

Вам не нужна глобальная переменная, вам нужна функциональность для вашего контекста, которая будет использоваться вашим приложением. Поэтому вам нужно использовать JNDI, на веб-странице Tomcat у вас есть способ сделать это, это хорошо объяснено и легко реализовать. С наилучшими пожеланиями.

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

0

Вы, кажется, говорили об использовании непосредственно подключение к базе данных из файлов JSP, не так ли? Ну, это не теоретически правильное решение, потому что, следуя принципу разделения проблем, ваш взгляд - ваш JSP-файл - вообще ничего не должен знать о базах данных или доступе к данным. Проверьте любое описание MVC шаблон, например, это довольно очевидно ;-):

Wikipedia on MVC pattern

Но если вы хотите взять shorcut и иметь свой взгляд в курсе вашей базе данных у вас есть, на мой взгляд, два варианта , оба из которых связаны с JNDI-поиском источника данных, ранее определенного в вашем приложении, как уже сказано Marcelo Tataje.

О том, как определить на Tomcat в JNDI источника данных на основе пула соединений:

http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

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

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<sql:query var="rs" dataSource="jdbc/TestDB"> 
select id, foo, bar from testdata 
</sql:query> 

<html> 
    <head> 
    <title>DB Test</title> 
    </head> 
    <body> 

    <h2>Results</h2> 

<c:forEach var="row" items="${rs.rows}"> 
    Foo ${row.foo}<br/> 
    Bar ${row.bar}<br/> 
</c:forEach> 

    </body> 
</html> 

Is java.sql.Connection thread safe?

другой немного лучшее решение есть в коде Java, JNDI Lookup источника данных, как это из вашего контекста слушателя:

public void contextInitialized(ServletContextEvent contextEvent) { 
     // JNDI Datasource lookup 
     InitialContext context = new InitialContext(); 
     DataSource dataSource = (DataSource) context 
       .lookup("jdbc/DataSource"); 
     // Storing datasource in application context 
     contextEvent.getServletContext().setAttribute("datasource",dataSource); 
    } 

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

((DataSource)contextEvent.getServletContext().getAttribute("datasource")).getConnection() 

Не используйте непосредственно класс подключения. Это ужасно примитивно и устарело. В настоящее время никто в серьезной рабочей среде не занимается такими связями. Если вы сделаете то, что предложили AmitG, вы получите уникальное соединение, доступное для всех одновременных доступов. Посмотрите на это, почему это не так.

+0

Я не говорил о доступе к db напрямую с JSP, я использую сервлет для подключения и выполнения всех запросы – BackSlash

Смежные вопросы