2

EJB3 プロジェクトの DAO レイヤーを設計しています。これらはステートレス セッション Bean です。何らかの理由で、一部の DAO は JPA を使用せず、JDBC を使用して直接データベースにアクセスします。

したがって、EntityManager を注入する代わりに、Datasource を注入し、そこから Connection を取得したり、Session を作成したりできます...重複した作業を避けるために、最初に Datasource から Connection を取得する POJO BaseClass を作成し、破棄する前に閉じてください。すべての JDBC DAO はそれを拡張するため、そのような作業を自分で行う必要はありません。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();  
        }
    }

}

たとえば、1 つの 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 セッション Bean をどのように設計すればよいのでしょうか? 何か良いパターンはありますか?ありがとう!

4

1 に答える 1

2

確立された接続はJBossによって監視されている可能性があります。サーバーがすでに閉じている場合でも接続を閉じようとしているようです。これらのメッセージは無視できます。おそらくメッセージは通常の処理を中断せず、jboss設定ファイルを変更することで無効にできます。

メソッドをコールバックし、コンテナによって処理されます@PostConstruct@PreDestroyメソッド呼び出しごとにステートレスセッションBeanインスタンスを作成および破棄するベンダー固有。プール状態の場合と同様に、Beanインスタンスは長期間アクティブになる可能性があります。

実行時に例外が発生した場合は、メソッド自体で接続を開き、createSessionメソッドで終了する前に接続を閉じることをお勧めします。finally

また、JBossで報告されたこのバグを参照することもできます。

于 2011-11-17T18:18:15.673 に答える