Я разрабатываю слой 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? Есть ли хороший образец?
Спасибо!