[JAVA] Da das Lesen von JdbcCodeList von TERASOLUNA langsam ist, habe ich versucht, mehrere gleichzeitig zu registrieren.

TERASOLUNAs JdbcCodeList ist eine Funktion, die die Ergebnisse von SQL-Suchen aus der Datenbank als Codeliste registriert, und ich denke, sie wird häufig verwendet. Es ist keine große Sache mit ein oder zwei Codelisten, aber wenn die Anzahl der Codelisten Hunderte von Klassen erreicht, wird die Zeit, die für den Start benötigt wird, unerträglich.

Also fragte ich mich, ob ich mehrere Codelisten gleichzeitig bei "UNION ALL" registrieren könnte, wie unten gezeigt.

SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_ORDERSTATUS'
UNION ALL
SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_HOGE'
ORDER BY code_bean_name, code_id

Da die Codeliste 1 Codeliste und 1 Bean-Definition enthält, muss die Bean-Definition dynamisch hinzugefügt werden, um mehrere Codelisten zu registrieren. Wenn Sie eine Implementierungsklasse für die Schnittstelle "org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor" erstellen, können Sie anscheinend Beans dynamisch hinzufügen. Wenn Sie über die Implementierungsklasse dieses "BeanDefinitionRegistryPostProcessor" auf die Datenbank zugreifen und die Bean der Codeliste registrieren, können Sie tun, was Sie wollen.

Wenn ich es jedoch tatsächlich ausführe, ist der DB-Zugriff nicht gut. Zu dem Zeitpunkt, an dem "BeanDefinitionRegistryPostProcessor" funktioniert, scheinen Platzhalter wie "$ {hogehoge}" der Bean-Definition nicht aufgelöst zu sein, und die Zeichenfolge vor der DB-Verbindungszeichenfolge usw. wird in der Eigenschaft ("$" festgelegt {hogehoge} `selbst) wurde genommen und es scheint, dass ich mich nicht gut verbinden kann. Wenn Sie in der DataSource-Definition keine Platzhalter verwenden und die Verbindungszeichenfolge usw. direkt in der Bean-Definition beschreiben, können Sie eine DB-Verbindung herstellen, aber das direkte Schreiben in XML ist nicht gut.

Daher habe ich es aufgegeben, nur die Implementierungsklasse von "BeanDefinitionRegistryPostProcessor" abzuschließen, und sie in zwei Stufen unterteilt. Die Implementierungsklasse BeanDefinitionRegistryPostProcessor definiert nur die Bean-Definitionen in der erforderlichen Codeliste. (Der Inhalt der Codeliste ist jedoch leer.) Greifen Sie mit einer anderen Klasse "@ PostConstruct" auf die Datenbank zu und legen Sie die Wertezuordnung in der leeren Codeliste fest. Das Implementierungsimage ist wie folgt.

CustomBeanDefinitionRegistryPostProcessor.java


/**
 *
 */
package xxxxxx.yyyyyy.zzzzzz.app.welcome;

import java.util.List;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.terasoluna.gfw.common.codelist.SimpleMapCodeList;

/**
 * @author toshio
 *
 */
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
	private List<String> codeListNames;

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
	}

	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		if (codeListNames != null) {
			for (String codeBeanName : codeListNames) {
				BeanDefinition beanDefinition = new RootBeanDefinition(SimpleMapCodeList.class);
				registry.registerBeanDefinition(codeBeanName, beanDefinition);
			}
		}
	}

	/**
	 * @param codeListNames set codeListNames
	 */
	public void setCodeListNames(List<String> codeListNames) {
		this.codeListNames = codeListNames;
	}

}

CustomCodeListLoader.java


/**
 *
 */
package xxxxxx.yyyyyy.zzzzzz.app.welcome;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.terasoluna.gfw.common.codelist.SimpleMapCodeList;

/**
 * @author toshio
 *
 */
public class CustomCodeListLoader {
	/**
	 * Database access information
	 */
	private JdbcTemplate jdbcTemplate;

	@Autowired
	private ApplicationContext applicationContext;

	/**
	 * SQL Query to access the database
	 */
	private String querySql;

	private List<String> codeListNames;

	/**
	 *
	 */
	private String codeNameColumn;

	/**
	 * property that holds the name of the column of the database holding the value part of the codelist
	 */
	private String valueColumn;

	/**
	 * property that holds the name of the column of the database holding the label part of the codelist
	 */
	private String labelColumn;

	@PostConstruct
	public void afterPropertiesSet() {

		Map<String, Map<String, String>> allMap = new HashMap<String, Map<String, String>>();
		for (String codeName : codeListNames) {
			allMap.put(codeName, new LinkedHashMap<String, String>());
		}

		List<Map<String, Object>> rows = jdbcTemplate.queryForList(querySql);
		for (Map<String, Object> row : rows) {
			Object codeName = row.get(codeNameColumn);
			Object key = row.get(valueColumn);
			Object value = row.get(labelColumn);
			if (codeName != null && key != null && value != null) {
				Map<String, String> map = allMap.get(codeName.toString());
				if (map == null) {
					map = new LinkedHashMap<String, String>();
				}
				map.put(key.toString(), value.toString());
				allMap.put(codeName.toString(), map);
			}
		}

		for (Entry<String, Map<String, String>> codeEnt : allMap.entrySet()) {
			Object codeBean = applicationContext.getBean(codeEnt.getKey());
			if (codeBean instanceof SimpleMapCodeList) {
				SimpleMapCodeList smc = (SimpleMapCodeList) codeBean;
				smc.setMap(codeEnt.getValue());
			}
		}
	}

	/**
	 * Sets JdbcTemplate
	 * @param jdbcTemplate JdbcTemplate instance for fetching code list records
	 */
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	/**
	 * Setter method for labelColumn
	 * @param labelColumn column name for fetch a code label
	 */
	public void setLabelColumn(String labelColumn) {
		this.labelColumn = labelColumn;
	}

	/**
	 * Setter method for valueColumn
	 * @param valueColumn column name for fetch code value
	 */
	public void setValueColumn(String valueColumn) {
		this.valueColumn = valueColumn;
	}

	/**
	 * Setter method for querySql
	 * @param querySql sql for fetching code list records from database
	 */
	public void setQuerySql(String querySql) {
		this.querySql = querySql;
	}

	public void setCodeNameColumn(String codeNameColumn) {
		this.codeNameColumn = codeNameColumn;
	}

	/**
	 * @param codeListNames set codeListNames
	 */
	public void setCodeListNames(List<String> codeListNames) {
		this.codeListNames = codeListNames;
	}

}

projectName-codelist.xml


    <bean class="xxxxxx.yyyyyy.zzzzzz.app.welcome.CustomBeanDefinitionRegistryPostProcessor">
        <property name="codeListNames">
            <list>
                <value>CL_ORDERSTATUS</value>
                <value>CL_HOGE</value>
            </list>
        </property>
    </bean>

    <bean class="xxxxxx.yyyyyy.zzzzzz.app.welcome.CustomCodeListLoader">
        <property name="querySql">
            <value>
                SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_ORDERSTATUS'
                UNION ALL
                SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_HOGE'
                ORDER BY code_bean_name, code_id
            </value>
        </property>
        <property name="codeNameColumn" value="code_bean_name"/>
        <property name="valueColumn" value="code_id" />
        <property name="labelColumn" value="code_name" />
        <property name="jdbcTemplate" ref="jdbcTemplateForCodeList" />
        <property name="codeListNames">
            <list>
                <value>CL_ORDERSTATUS</value>
                <value>CL_HOGE</value>
            </list>
        </property>
    </bean>

CREATE TABLE t_sample_codes (
                                code_bean_name varchar(32) not null,
                                code_id        varchar(32) not null,
                                code_name      varchar(256) not null,
                                primary key (code_bean_name, code_id)
                            );

INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_ORDERSTATUS', '1', 'Received');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_ORDERSTATUS', '2', 'Sent');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_ORDERSTATUS', '3', 'Cancelled');

INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_HOGE', '1', 'hoge');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_HOGE', '2', 'hogehoge');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_HOGE', '3', 'hogehogehoge');

commit;

Recommended Posts

Da das Lesen von JdbcCodeList von TERASOLUNA langsam ist, habe ich versucht, mehrere gleichzeitig zu registrieren.
Ich habe versucht, mit der Java Stream-API eine Methode zu erstellen, die mehrere Filter gleichzeitig anwendet. Ist das in Ordnung?
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Das Argument von link_to ist nil (null) und ein unerwarteter Link wurde generiert, daher habe ich versucht, ihn zu überprüfen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, das Problem mit der Ruby-Karaoke-Maschine zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, das Problem mit dem Ruby-Bonusgetränk zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, das Problem bei der Erstellung von Ruby-Bingokarten zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, den Code zu implementieren, um mehrere Bilder gleichzeitig in der Watson Visual Recognition Collection in Java zu lernen
Ich habe versucht zusammenzufassen, was bei der Site-Java-Ausgabe gefragt wurde.
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
So rufen Sie mehrere Namen gleichzeitig in derselben Kategorie auf
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
Ich habe versucht, die Methode zu erklären
Für Sie, die beklagen, dass die Konvertierung von JODConverter + LibreOffice langsam ist
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Stream-API zusammenzufassen
Was ist Docker? Ich habe versucht zusammenzufassen
Ich wollte eine Diashow des Hintergrundbilds erstellen, da das Bild des Sperrbildschirms von Windows 10 wunderschön ist
Ich habe versucht, die Infrastrukturtechnologie der Ingenieure heutzutage mit dem Kochen zu vergleichen.
Ich versuchte noch einmal zusammenzufassen, was auf den ersten Blick schwierig war
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
C # (Grund der Kapselung)
Ich möchte den Inhalt der Absicht var_dump
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe versucht, den Betrieb der http-Anfrage (Put) mit dem Talented API Tester zu überprüfen
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen