Liferay / Tomcat"热部署"关闭JNDI连接,如何保持打开状态?

时间:2013-09-04 18:02:14

标签: java spring tomcat liferay datasource

首先,我不确定该行为是来自Liferay还是Tomcat。

我在Liferay中有一个portlet,它使用JNDI连接和JDBC模板全部配置spring(我没有使用Liferay服务构建器或Liferay中的任何东西,我只是将它用作portlet容器)。

当我启动服务器时,JNDI连接正常工作(我能够从数据库中检索数据)。 当我在liferay中“热部署”我的portlet 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配置(通过组件扫描语句扫描):

@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”方法时,这将一直有效,直到我重新部署我的portlet WAR。然后,如果我在方法中使用断点,我可以看到连接已关闭(closed = true)。

无论如何我可以重新建立连接吗?

1 个答案:

答案 0 :(得分:3)

将此属性添加到门户网站:

portal.security.manager.strategy=none

我遇到了同样的问题,这对我有用。