LINUX.ORG.RU

Не могу из сервлета подсоединиться к базе данных.

 ,


0

1

Учусь взаимодействовать с бд(mysql). В eclipse создал обычный java проект, добавил коннектор и все как по маслу, а вот при попытке повторить тот же финт с сервлетом DriverManager.getConnection возвращает null(для соединения используется точно такой же код), в чем может быть проблема? Собственно сам проект http://rghost.ru/46035634

★★★

Адовый код.
Не надо напрямую из сервлета делать запросы к базе. Создай отдельный пакет для работы с базой, там создай все нужные методы и из сервлета вызывай только их.

Лучше всего: подключение к базе и тп - в отдельный класс-обертку.
Потом в интерфейсе описываешь все нужные методы (getAllSomething(), getById(int id), etc.).
Потом делаешь реализацию интерфейса - там подключение к базе, prepared statement'ы и resultset'ы берешь из обертки.
Потом делаешь запросы и возвращаешь результат.
Потом делаешь singleton-фабрику интерфейсов с placeholder'ами и в сервлете все вызовы методов делаешь только через нее.

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

Формально, у тебя будут классы наподобие:
1. DBUtils - работа с базой - подключение, connection pool, result-set, prepared statement'ы, выполнение запросов и тд.
2. Интерфейсы, например: UsersService
3. Реализация интерфейсов: UsersServiceImpl (здесь делаются запросы и возвращаются результаты - например, getAllUsers() )
4. Singleton-Фабрика - ServicesFactory
5. Сервлет, в котором делаешь: ArrayList<User> users = ServicesFactory.getUsersService().getAllUsers();

kovrik ★★★★★
()

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

И предлагать скачивать исходники в виде рар-архива это какой-то изврат. pastebin отменили что ли?

Legioner ★★★★★
()

А еще никогда не делай new String(); Просто сделай String tempstr = "";
А еще всегда используй placeholder'ы в SQL-запросах.

kovrik ★★★★★
()

А еще у тебя плохо названы переменные - ss, st, rs и тд

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

Благодарен за подробные разъяснение, извиняюсь за кривой код (с java знаком 2 недели, так что правил грамотной организации проекта ещё не уяснил), но все же это вряд ли решит данную проблему.

LIKAN ★★★
() автор топика
Ответ на: комментарий от kovrik

Проще нахерачить листенер, который при старте приложения инициализирует пул подключений к базе данных и положит его в ServletContext. Самописный пул пускай будет thread-safe, тогда его можно будет дергать из сервлетов и звать нужные методы без опасений что что-то пойдет не так.

anonymous
()
Ответ на: комментарий от anonymous

Особой разницы не вижу.
Делаем статический singleton-класс DBService, который при инициализации делает пул (зачем самописный? есть же bonecp или apache-commons-pool). И у него потом вызывать только статический метод getConnection().

kovrik ★★★★★
()

Автор. Возможно, нужна строчка.

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

Перед тем как вызывать соединение.

Adonai ★★★
()

Положи mysql-connector-java в WebContent\WEB-INF\lib и перед строчкой

conn = DriverManager.getConnection(«jdbc:mysql://localhost:3306/mybase»,connInfo);

вставь: Class.forName(«com.mysql.jdbc.Driver»);

Nagwal ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.