2016-09-08 6 views
0

Я построю некоторый проект модуляции в java с 5 слоями.
1-й слой - фасоль (классы)
2-й слой - DaoDB (классы)
3-й слой - Dao (интерфейсы) - это яркий (от фасада до DaoDB)
4-й слой - фасад (классы) - бизнес-логика и
5-й слой - Dynamic Web Project с JAX-RS и JSON

у меня есть проблема с моим методом входа в 5-м слое.JAVA EE/RESTful - JAX-RS и JSON throw SQLException для Class.forName (... ClientDriver)

@Path("/web-project") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class AdminService{ 

private Company companyBean; 

private AdminFacade getAdminFacade(HttpServletRequest req) { 
    AdminFacade facade = ((AdminFacade) req.getSession().getAttribute("adminFacade")); 
    return facade; 
} 

@Path("/login") 
@POST 
public Message adminLogin(LogInBean lgb, @Context HttpServletRequest req) throws UserSystemException, ClassNotFoundException { 

    // Class.forName("org.apache.derby.jdbc.ClientDriver"); 

    CouponClientFacade facade=CouponSystem.getInstance().login(lgb.getLogin(), lgb.getPassword(), "Admin"); 

    HttpSession session = req.getSession(true); 
    session.setAttribute("adminFacade", facade); 
    return new Message("logged in successfully as admin"); 
} 
..... 
..... 

Проблема с базой данных - ClientDriver. Я получаю SQLException, когда пытаюсь добавить новую компанию. Если я не использую с Class.forName("org.apache.derby.jdbc.ClientDriver"); и когда я пытаюсь запустить другие (CRUD) методы - например

@Path("/createnewcompany") 
@POST 
public Message addCompany(Company cb, @Context HttpServletRequest req) throws UserSystemException { 
    getAdminFacade(req).createCompany(cb); 
    return new Message("created a new company: " + cb.getCompName()); 
} 

я получаю исключение, но, если я иду к фасадным слоем и попытаться запустить все CRUD метод они работают хорошо.

Почему JAX-RS не работает с драйвером клиента, написанным на первом уровне?

И JAX-RS и JSON работают нормально, когда я явно пишу по методу входа в систему только для реализации драйвера - Class.forName("org.apache.derby.jdbc.ClientDriver");.

Спасибо за помощь.

ответ

0

Таким образом, ваши фасады являются одноточиями и состоянием, а ваш веб-уровень не имеет апатрий и имеет область запроса.

Таким образом, в каждом запросе это новый поток, и возможно, что драйвер связан с потоком. Это случай с оракулом:

Общаясь Соединения с резьбой

Чтобы связать соединения с резьбой, установите ассоциироваться с атрибутом Thread к истине. По умолчанию используется значение false. Настоящий параметр позволяет связывать соединения как ThreadLocal в вызывающем потоке. Подключения восстанавливаются только тогда, когда вызывающий поток умирает или когда вызывающий поток не используется, а пул закончил соединения. Если параметр является ложным, поток должен получать соединение из пула каждый раз, когда поток требует подключения.

Как в стороне, с вашей многоуровневой архитектурой, ваш веб-сайт ничего не должен делать с базой данных, так? (он должен выполнять только валидацию и перевод ввода/вывода. Фактическая бизнес-логика должна вызывать уровень базы данных для выполнения операций с базой данных)

+0

Да, это правда, и это так. – morris

+0

Если я удалю комментарии из // Class.forName ("org.apache.derby.jdbc.ClientDriver"); система работает хорошо. Я думаю, что хороший способ не использовать с ClientDriver в моем веб-модуле. И если я прокомментирую это, то у меня есть исключение. – morris

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

  • Нет связанных вопросов^_^