首先,我不确定该行为是来自 Liferay 还是来自 Tomcat。
我在 Liferay 中有一个使用 JNDI 连接和 JDBC 模板的 portlet,所有这些都配置了 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。然后,如果我在方法内使用断点,我可以看到连接已关闭(关闭 = true)。
无论如何我可以重新建立连接吗?