Я работаю над этим проектом, который прошел через множество кодеров . Приложение является двухчастным - веб-и пакетным. Веб-часть предоставляет базовый пользовательский интерфейс, позволяющий пользователю установить некоторые конфигурации. Он использует 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);
...
}
}
Я использую OSGI, который немного отличается от Spring, и мы можем успешно использовать один и тот же источник данных между различными компонентами bean. Я думаю, что это тоже хорошо весной. – vikingsteve