2

まず、動作が Liferay によるものなのか Tomcat によるものなのかわかりません。

JNDI接続とJDBCテンプレートをすべてSpringで構成したLiferayのポートレットがあります(LiferayサービスビルダーやLiferayのものは使用していません。ポートレットコンテナとして使用しているだけです)。

サーバーを起動すると、JNDI 接続が機能します (データベースからデータを取得できます)。liferay でポートレット WAR を「ホット デプロイ」すると、接続が閉じられます。したがって、データにアクセスしようとすると、次のエラーが発生します。

java.sql.SQLException: Data source is closed
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1362)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

DataSource 構成 (component-scan ステートメントを介してスキャンされる) :

@Bean

public DataSource myDbDataSource() {

    String jndiName = "java:comp/env/jdbc/MyDB";

    try {
        Context jndi = new InitialContext();
        DataSource ds = (DataSource) jndi.lookup(jndiName);
        return ds;
    } catch (NamingException e) {
        throw new IllegalStateException(e.getMessage(), e);
    }
}

jdbcTemplate の構成 (DAO クラスから)

private JdbcTemplate jdbcTemplate;
private DataSource myDbDataSource;

@Autowired
public void setDataSource(DataSource myDbDataSource) {
    this.jdbcTemplate = new JdbcTemplate(myDbDataSource);
    this.myDbDataSource = myDbDataSource;
}

データへのアクセス (DAO クラスから) :

@Override
public List<MyObject> findAllObjects() {
    String sql = "SELECT * FROM objects";

    List<MyObject> objects = (List<MyObject>) jdbcTemplate.query(sql,
            new BeanPropertyRowMapper<MyObject>(MyObject.class));

    return lobjects;
}

コントローラーから「findAllObjects」メソッドを呼び出すと、ポートレット WAR を再デプロイするまで機能します。次に、メソッド内でブレークポイントを使用すると、接続が閉じられていることがわかります (closed = true)。

接続を再確立できる方法はありますか?

4

1 に答える 1