2013-09-04 4 views
2

Во-первых, я не уверен, что поведение происходит от Liferay или Tomcat.Liferay/Tomcat «hot-deploy» закрывает соединение JNDI, как я могу держать его открытым?

У меня есть портлет в Liferay, который использует JNDI-соединение и шаблон JDBC, настроенный с использованием Spring (я не использую Liferay service builder или что-либо из Liferay, я просто использую его как контейнер портлета).

Когда я запускаю сервер, соединение JNDI работает (я могу получить данные из базы данных). Когда я «горячо развертываю» свой портлет WAR в liferay, соединение закрывается. Так что, когда я пытаюсь получить доступ к данным, я получаю эту ошибку:

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» с контроллера, это работает до тех пор, пока я не переустановит мой портлет WAR. Тогда, если я использую точку останова внутри метода, я вижу, что соединение закрыто (closed = true).

В любом случае, я могу восстановить соединение?

ответ

3

Добавить эту недвижимость в портал:

portal.security.manager.strategy=none 

У меня была та же проблема, и это работает для меня.

+0

Это была спасательная жизнь - очень ценится +1 – user2124871