Проект EJB3 DAO без сохранения состояния (используйте соединение JDBC) - PullRequest
2 голосов
/ 17 ноября 2011

Я разрабатываю слой DAO для проекта EJB3, это сессионный компонент без сохранения состояния. По некоторым причинам, часть DAO не будет использовать JPA, они получают доступ к базе данных напрямую через JDBC.

Таким образом, вместо внедрения EntityManager, я внедряю источник данных, и из него я могу получить соединение, создать сеанс и т. Д. Чтобы избежать дублирования работы, я создал базовый класс POJO, который получает соединение из источника данных в начале и закрыть его, прежде чем уничтожить. Все DAO JDBC расширяют его, поэтому им не нужно выполнять такую ​​работу самостоятельно. BaseClass выглядит так:

public abstract class MemDBDAO {

    @Resource(mappedName = "java:MagicCardDS")
    private DataSource dataSource;
    protected Connection dbConnection;

    @PostConstruct
    protected void startUp() {
        try {
            dbConnection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();  
        }
    }

    @PreDestroy
    protected void shutDown() {
        try {
            dbConnection.close();
        } catch (SQLException e) {
            e.printStackTrace();  
        }
    }

}

И, например, один JDBC DAO выглядит так:

@Stateless
public class SessionDAOBean extends MemDBDAO implements SessionDAO {


    @Override
    public void createSession(String sessionId, Integer userId) {
        try {
            PreparedStatement statement = dbConnection.prepareStatement(
                    "INSERT INTO session VALUES(?, ?, ?, ?)");
            statement.setString(1, sessionId);
            statement.setInt(2, userId);
            statement.setBoolean(3, false);
            statement.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();  
        }
    }
...

При развертывании на сервере приложений JBoss 6 я получаю следующие сообщения об ошибках:

20:51:12,546 INFO  [org.jboss.resource.connectionmanager.CachedConnectionManager] Closing a connection for you.  Please close them yourself: org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@9bb04a: java.lang.Throwable: STACKTRACE
    at org.jboss.resource.connectionmanager.CachedConnectionManager.registerConnection(CachedConnectionManager.java:278) [:6.1.0.Final]
    at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:524) [:6.1.0.Final]
    at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:941) [:6.1.0.Final]
    at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:89) [:6.1.0.Final]
    at piapox.com.magiccard.server.dao.MemDBDAO.startUp(MemDBDAO.java:32) [:]
    at piapox.com.magiccard.server.dao.SessionDAOBean.startUp(SessionDAOBean.java:35) [:]
...

Итак, как мне проектировать компоненты JDBC DAO Session? Есть ли хороший образец? Спасибо!

1 Ответ

2 голосов
/ 17 ноября 2011

Вероятно, установленные соединения контролируются JBoss.Кажется, сервер пытается закрыть соединение, даже если оно уже закрыто, эти сообщения можно игнорировать.Возможно, сообщение не прерывает нормальную обработку и может быть отключено путем изменения файла конфигурации jboss.

Методы обратного вызова @PostConstruct & @PreDestroy обрабатываются контейнером.Его поставщик специфичен для создания и уничтожения экземпляра сессионного компонента без сохранения состояния для каждого вызова метода.Как и в состоянии пула, экземпляр компонента может быть активным в течение длительного периода.

Лучше открыть соединение в самом методе и закрыть его перед выходом в методе createSession, finally предпочтительнее в случае исключений привремя выполнения.

Также вы можете сослаться на эту ошибку , сообщенную JBoss.

...