2013-02-26 3 views
2

Я работаю над этим проектом, который прошел через множество кодеров . Приложение является двухчастным - веб-и пакетным. Веб-часть предоставляет базовый пользовательский интерфейс, позволяющий пользователю установить некоторые конфигурации. Он использует JDBC/JNDI/non-Spring, и на основе этого были написаны DAO.Можно ли кэшировать один экземпляр объекта javax.sql.Datasource?

Пакетная часть генерирует файлы, такие как PDF, PostScripts, XML и т. Д. Этот бит использует JDBC/Spring, и DAO были написаны на основе этого.

Теперь существует только одна кодовая база, но коды разделены в нескольких папках или модулях - веб (военный файл), пакетные (java-приложения, запущенные из .bat или .sh) и Commons (файл jar). Хотя и Web, и Batch используют один и тот же файл jar Commons, DAO настолько фрагментированы, что трудно написать новый модуль с общими DAO, которые могут использоваться как в кодах, развернутых в Интернете, так и в пакетном режиме.

Поскольку я буду поддерживать этот проект в течение долгого времени, я решил начать делать улучшения. Прежде всего, объединение всех DAO таким образом, что новые модули будут использовать унифицированный набор DAO и старых модулей для использования существующих хрупких кодов.

Ниже, com.abc.core2.dao.ABCDAO будет содержать ссылку на один экземпляр DataSource и использовать это либо в сети, либо в пакете для получения соединений из базы данных. Объекты DataSource берутся из ядра DAO каждого модуля и кэшируют его в переменной экземпляра ABCDAO.dataSource.

Кто-нибудь сделал что-то подобное раньше? Любые проблемы с сохранением одного объекта DataSource до перезапуска приложения?

Изменение все еще прототип. Мой клиент передал некоторые другие простые изменения кучам людей.

Common (баночка файл)

package com.abc.core2.dao; 
public class ABCDAO { 
    private static ABCDAO abcdao = new ABCDAO(); 
    private DataSource dataSource; 
    public void setInternalDataSource(DataSource dataSource) {this.dataSource = dataSource;} 
    public DataSource getInternalDataSource() { return this.dataSource; } 
    public static ABCDAO getInstance() { return this.abcdao; } 
    ... 
} 
public class NewModuleJdbcDao implements NewModuleDAO { 
    ... 
    public List<XYZBean> getXYZ(SearchBean sb) { 
     Connection con = ABCDAO.getInstance().getInternalDataSource().getConnection(); 
     ... 
     con.close(); 
     return listOfXYZBeans; 
    } 
} 

Batch Применение

import com.abc.core2.dao.ABCDAO; 
public abstract InformixBaseDAO extends ABCBaseDAO { 
    { 
     // via Spring JDBC XML configuration 
     ABCDAO.getInstance().setDataSource(NewConnectionPooler.getInstance().dataSource()); 
    } 
    public Connection getConnection() throws SQLException { 
     // pre-existing method. It does NewConnectionPooler.getInstance().getConnection() 
     ... 
     return connection; 
    } 
} 

// Use same NewModuleJdbcDao in Web application 
public class NewModuleClass001 { 

    public void show(SearchBean bean) { 
     ... 
     NewModuleJdbcDao dao = new NewModuleJdbcDao(); 
     List<XYZBean> list = dao.getXYZ(bean); 
     ... 
    } 
} 

Web Application

import com.abc.core2.dao.ABCDAO; 
public class DBConnection { 
    private static DataSource dataSource = null; 
    { 
     if(dataSource == null) { 
      dataSource = ServiceLocator.getInstance().getDataSource(...); // via JNDI 
      ABCDAO.getInstance().setDataSource(dataSource); 
     } 
    } 
    public static Connection() { 

     // Spring JDBC 
     ... 
    } 
} 

// Use same NewModuleJdbcDao in Web application 
public class NewModuleClass001 { 

    public void show(SearchBean bean) { 
     ... 
     NewModuleJdbcDao dao = new NewModuleJdbcDao(); 
     List<XYZBean> list = dao.getXYZ(bean); 
     ... 
    } 
} 

ответ

0

I A в моей практике используется эта стратегия и не знакомы с какой-либо проблемой, основанной на этом решении. Если вы используете также Spring, определите свой объединенный источник данных в виде одноэлементного компонента с приложениями и введите его в свои модули.

+1

Я использую OSGI, который немного отличается от Spring, и мы можем успешно использовать один и тот же источник данных между различными компонентами bean. Я думаю, что это тоже хорошо весной. – vikingsteve

Смежные вопросы