[JAVA] Puisque la lecture de JdbcCodeList de TERASOLUNA est lente, j'ai essayé d'enregistrer plusieurs à la fois.

JdbcCodeList de TERASOLUNA est une fonction qui enregistre les résultats des recherches SQL à partir de la base de données sous forme de liste de codes, et je pense qu'elle est souvent utilisée. Ce n'est pas un gros problème avec une ou deux listes de codes, mais lorsque le nombre de listes de codes atteint des centaines de classes, le temps de démarrage devient insupportable.

Je me suis donc demandé si je pouvais enregistrer plusieurs listes de codes à la fois avec ʻUNION ALL` comme indiqué ci-dessous.

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

Puisque la liste de codes a 1 liste de codes et 1 définition de bean, il est nécessaire d'ajouter dynamiquement la définition de bean afin d'enregistrer plusieurs listes de codes. ʻOrg.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessorSi vous créez une classe d'implémentation pour l'interface, il semble que vous puissiez ajouter des beans dynamiquement. Si vous accédez à la base de données à partir de la classe d'implémentation de ceBeanDefinitionRegistryPostProcessor` et enregistrez le Bean de la liste de codes, vous pouvez faire ce que vous voulez.

Cependant, lorsque je l'exécute, l'accès à la base de données n'est pas bon. Apparemment, au moment où BeanDefinitionRegistryPostProcessor fonctionne, il semble que les espaces réservés tels que $ {hogehoge} ʻ de la définition de Bean ne sont pas résolus, et la chaîne de caractères avant la chaîne de caractères de connexion à la base de données, etc. est définie à partir de la propriété ( $ {hogehoge} ʻitself) a été prise et il semble que je ne peux pas bien me connecter. Si vous n'utilisez pas d'espaces réservés dans la définition de DataSource et décrivez la chaîne de caractères de connexion, etc. directement dans la définition de Bean, vous pouvez établir une connexion à la base de données, mais écrire directement en XML n'est pas bon.

Par conséquent, j'ai renoncé à terminer avec uniquement la classe d'implémentation de BeanDefinitionRegistryPostProcessor et l'ai divisée en deux étapes. La classe d'implémentation BeanDefinitionRegistryPostProcessor définit uniquement les définitions de bean dans la liste de codes requise. (Cependant, le contenu de la liste de codes est vide) Accédez à la base de données avec une autre classe @ PostConstruct et définissez la table de valeurs dans la liste de codes vide. L'image d'implémentation est la suivante.

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 définir 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 définir 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

Puisque la lecture de JdbcCodeList de TERASOLUNA est lente, j'ai essayé d'enregistrer plusieurs à la fois.
J'ai essayé de créer une méthode qui applique plusieurs filtres à la fois avec l'API Java Stream. Cela vous convient-il?
J'ai essayé de réduire la capacité de Spring Boot
L'argument de link_to est nul (nul) et un lien inattendu a été généré, j'ai donc essayé de le vérifier
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)
J'ai essayé de résoudre le problème de la boisson bonus Ruby (il y a un exemple de réponse)
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé de résoudre le problème de création de carte de bingo Ruby (il y a un exemple de réponse)
J'ai essayé d'implémenter le code pour apprendre plusieurs images à la fois dans la Watson Visual Recognition Collection en Java
J'ai essayé de résumer ce qui était demandé lors de l'édition site-java-
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé de résumer les méthodes de Java String et StringBuilder
Comment appeler plusieurs noms à la fois dans la même catégorie
J'ai essayé de résoudre le problème de Google Tech Dev Guide
J'ai essayé d'expliquer la méthode
A vous qui regrettez que la conversion de JODConverter + LibreOffice soit lente
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
[Introduction à Java] J'ai essayé de résumer les connaissances que j'estime essentielles
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
J'ai essayé de résumer les méthodes utilisées
Comme la commande du utilisée lorsque la capacité est pleine est difficile à utiliser, j'ai essayé de l'envelopper avec du rubis
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé de résumer l'API Stream
Qu'est-ce que Docker? J'ai essayé de résumer
Je voulais faire un diaporama du fond d'écran car l'image de l'écran de verrouillage de Windows 10 est magnifique
J'ai essayé de comparer la technologie d'infrastructure des ingénieurs ces jours-ci avec la cuisine.
J'ai essayé de résumer à nouveau le projet qui était difficile à première vue
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
C # (base de l'encapsulation)
Je veux var_dump le contenu de l'intention
J'ai essayé de configurer tomcat pour exécuter le servlet.
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé de vérifier le fonctionnement de la requête http (Put) avec Talented API Tester
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand