[JAVA] Comment modifier un projet vierge de TERASOLUNA 5.x pour prendre en charge PostgreSQL

1.Tout d'abord

Dans l'état initial du projet vierge de TERASOLUNA Server Framework for Java (5.x), il est configuré pour utiliser h2db en mémoire comme base de données. Cette fois, je voudrais garder un mémorandum personnel sur la façon de changer la base de données en PostgreSQL.

1.1. Environnement de vérification

1.2. Flux de travail de modification compatible avec PostgreSQL

Le flux de travail pour modifier un projet vide pour prendre en charge PostgreSQL est illustré ci-dessous. Cette fois, nous utiliserons le pool de connexions préparé dans l'application au lieu du pool de connexions défini dans la source de données du serveur d'application (conteneur Servlet).

Numéro d'article travail Aperçu
1 Créer un projet vierge Créez un projet vierge selon les directives TERASOLUNA.
2 Préparation de la base de données à utiliser Créez une base de données et un utilisateur dans PostgreSQL sur localhost.
3 Ajouter la bibliothèque de la base de données à utiliser à la dépendance du pom parent Ajoutez une dépendance pour charger le pilote JDBC PostgreSQL.
4 Désactiver le processus d'initialisation de la base de données lors du démarrage de l'application Dans l'état initial, le traitement d'initialisation de la base de données h2db est défini, désactivez-le.
5 (Facultatif) Désactivez l'écriture du journal JDBC avec log4jdbc Désactivez le paramètre log4jdbc pour le débogage.
6 Modifier la destination de connexion à la base de données Configuré pour se connecter à la base de données préparée cette fois.
7 Ajouter la bibliothèque de la base de données à utiliser à la dépendance du projet de domaine Ajoutez une dépendance pour charger le pilote JDBC lors du test du domaine.
8 (Facultatif) Modifiez le projet initdb Puisque initdb a également une partie de paramétrage des informations de connexion de la base de données, corrigez cela.
9 (Facultatif) Créez une base de données à l'aide du projet initdb Construire la base de données préparée en 2 en utilisant initdb,Initialisez le processus.
10 Version d'essai 設定に不備がないことを確認するためVersion d'essaiを行います。
11 Début de l'essai 設定に不備がないことを確認するためDébut de l'essaiを行います。

2. Créez un projet vierge

Décrit dans la directive publiée "3.1.2. Création d'un projet de développement" Créez un projet vierge selon la procédure décrite ci-dessus. Cette fois, les paramètres du projet sont les suivants, et un projet vide est créé avec C: \ work comme répertoire courant.

Numéro d'article article valeur Remarques
1 archetypeArtifactId terasoluna-gfw-multi-web-blank-mybatis3-archetype Créé avec un multi-projet utilisant MyBatis
2 archetypeVersion 5.3.0.RELEASE La version est 5.3.0
3 groupId com.example.demo.postgresql
4 artifactId demo-database-postgresql

Créez un projet avec la commande mvn


mvn archetype:generate -B^
 -DarchetypeGroupId=org.terasoluna.gfw.blank^
 -DarchetypeArtifactId=terasoluna-gfw-multi-web-blank-mybatis3-archetype^
 -DarchetypeVersion=5.3.0.RELEASE^
 -DgroupId=com.example.demo.postgresql^
 -DartifactId=demo-database-postgresql^
 -Dversion=1.0.0-SNAPSHOT

Résultat d'exécution


...réduction...
[INFO] Parameter: groupId, Value: com.example.demo.postgresql
[INFO] Parameter: artifactId, Value: demo-database-postgresql
[INFO] Parent element not overwritten in C:\work\demo-database-postgresql\demo-database-postgresql-env\pom.xml
[INFO] Parent element not overwritten in C:\work\demo-database-postgresql\demo-database-postgresql-domain\pom.xml
[INFO] Parent element not overwritten in C:\work\demo-database-postgresql\demo-database-postgresql-web\pom.xml
[INFO] Parent element not overwritten in C:\work\demo-database-postgresql\demo-database-postgresql-initdb\pom.xml
[INFO] Parent element not overwritten in C:\work\demo-database-postgresql\demo-database-postgresql-selenium\pom.xml
[INFO] Project created from Archetype in dir: C:\work\demo-database-postgresql
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.941 s
[INFO] Finished at: 2017-08-31T10:12:00+09:00
[INFO] Final Memory: 10M/48M
[INFO] ------------------------------------------------------------------------

C:\work>

Il réussit si BUILD SUCCESS est affiché et que le répertoire demo-database-postgresql spécifié par artifactId est créé sous le répertoire C: \ work.

3. Préparation de la base de données à utiliser

Créez une base de données et un utilisateur à utiliser, et préparez-les pour DDL. Cette fois, j'ai préparé une base de données dans PostgreSQL préparée dans localhost avec les paramètres suivants.

Numéro d'article article valeur
1 numéro de port 5432
2 Nom de la base de données demodb
3 Identifiant d'utilisateur demoUser
4 mot de passe demoPass

4. Ajoutez la bibliothèque de la base de données à utiliser à la dépendance du pom parent

Dans l'état initial, les paramètres d'Oracle et de PostgreSQL sont décrits dans un état commenté. Décommentez PostgreSQL et activez-le.

Avant correction


            <!-- == Begin Database == -->
<!--             <dependency> -->
<!--                 <groupId>org.postgresql</groupId> -->
<!--                 <artifactId>postgresql</artifactId> -->
<!--                 <version>${postgresql.version}</version> -->
<!--             </dependency> -->
<!--             <dependency> -->
<!--                 <groupId>com.oracle</groupId> -->
<!--                 <artifactId>ojdbc7</artifactId> -->
<!--                 <version>${ojdbc.version}</version> -->
<!--             </dependency> -->
            <!-- == End Database == -->

modifié


            <!-- == Begin Database == -->
             <dependency>
                 <groupId>org.postgresql</groupId>
                 <artifactId>postgresql</artifactId>
                 <version>${postgresql.version}</version>
             </dependency>
<!--             <dependency> -->
<!--                 <groupId>com.oracle</groupId> -->
<!--                 <artifactId>ojdbc7</artifactId> -->
<!--                 <version>${ojdbc.version}</version> -->
<!--             </dependency> -->
            <!-- == End Database == -->

5. Désactivez le processus d'initialisation de la base de données lors du démarrage de l'application

Dans l'état initial d'un projet vide, le fichier DDL spécifié par <jdbc: initialize-database> est exécuté au démarrage du conteneur DI, c'est-à-dire au démarrage de l'application. C'est nécessaire lors de l'utilisation d'une base de données en mémoire, mais je pense que cette fonction n'est pas nécessaire pour les applications Web générales. Mettez en commentaire et désactivez la description de <jdbc: initialize-database>.

Avant correction


    <jdbc:initialize-database data-source="dataSource"
        ignore-failures="ALL">
        <jdbc:script location="classpath:/database/${database}-schema.sql" encoding="UTF-8" />
        <jdbc:script location="classpath:/database/${database}-dataload.sql" encoding="UTF-8" />
    </jdbc:initialize-database>

modifié


    <!--
    <jdbc:initialize-database data-source="dataSource"
        ignore-failures="ALL">
        <jdbc:script location="classpath:/database/${database}-schema.sql" encoding="UTF-8" />
        <jdbc:script location="classpath:/database/${database}-dataload.sql" encoding="UTF-8" />
    </jdbc:initialize-database>
    -->

6. (Facultatif) Désactivez l'écriture du journal JDBC par log4jdbc

Si vous effectuez la transaction en lecture seule avec @Transactional (readOnly = true), le journal du message d'erreur sera généré en écrivant le journal de log4jdbc.

Journal des messages d'erreur de sortie


date:2017-08-31 20:04:25	thread:http-nio-8080-exec-2	X-Track:b67e7712dcc143f398f5e51b762e3dea	level:ERROR	logger:jdbc.audit                                      	message:2. Connection.setReadOnly(true)
org.postgresql.util.PSQLException:Vous ne pouvez pas modifier les propriétés en lecture seule pendant une transaction.
	at org.postgresql.jdbc2.AbstractJdbc2Connection.setReadOnly(AbstractJdbc2Connection.java:741)
	at org.apache.commons.dbcp2.DelegatingConnection.setReadOnly(DelegatingConnection.java:562)
	at org.apache.commons.dbcp2.DelegatingConnection.setReadOnly(DelegatingConnection.java:562)
	at net.sf.log4jdbc.ConnectionSpy.setReadOnly(ConnectionSpy.java:374)
...réduction...

Sans surprise, log4jdbc nécessite des transactions "lecture / écriture", même si l'application l'a défini sur "lecture seule". Étant donné que le message d'erreur n'est affiché que dans le journal, il n'affecte pas le traitement de l'application, mais je m'en soucie personnellement, donc je désactive toujours log4jdbc.

C'est facile à désactiver, supprimez simplement la définition de Bean dans Log4jdbcProxyDataSource et modifiez le beanId dataSource pour spécifier la source de données dbcp2.

Avant correction


    <bean id="realDataSource" class="org.apache.commons.dbcp2.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${database.driverClassName}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="defaultAutoCommit" value="false" />
        <property name="maxTotal" value="${cp.maxActive}" />
        <property name="maxIdle" value="${cp.maxIdle}" />
        <property name="minIdle" value="${cp.minIdle}" />
        <property name="maxWaitMillis" value="${cp.maxWait}" />
    </bean>


    <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg index="0" ref="realDataSource" />
    </bean>

modifié


    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${database.driverClassName}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="defaultAutoCommit" value="false" />
        <property name="maxTotal" value="${cp.maxActive}" />
        <property name="maxIdle" value="${cp.maxIdle}" />
        <property name="minIdle" value="${cp.minIdle}" />
        <property name="maxWaitMillis" value="${cp.maxWait}" />
    </bean>

    <!--
    <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg index="0" ref="realDataSource" />
    </bean>
    -->

7. Modifier la destination de connexion à la base de données

Cette fois, nous utiliserons le pool de connexions dbcp2 dans l'application. Par conséquent, les informations de connexion à la base de données (URL, numéro de port, ID utilisateur, mot de passe, etc.) doivent être gérées dans l'application. Par défaut dans TERASOLUNA 5.x, il est défini dans *** infra.properties. De plus, lors de l'utilisation de la source de données du serveur d'application avec JNDI, je l'expliquerai à un autre moment.

Avant correction


database=H2
database.url=jdbc:h2:mem:demo-database-postgresql;DB_CLOSE_DELAY=-1
database.username=sa
database.password=
database.driverClassName=org.h2.Driver
# connection pool
cp.maxActive=96
cp.maxIdle=16
cp.minIdle=0
cp.maxWait=60000

modifié


### default setting is H2
# database=H2
# database.url=jdbc:h2:mem:demo-database-postgresql;DB_CLOSE_DELAY=-1
# database.username=sa
# database.password=
# database.driverClassName=org.h2.Driver

### setting for postgreSQL
database=POSTGRESQL
database.url=jdbc:postgresql://127.0.0.1:5432/demodb
database.username=demoUser
database.password=demoPass
database.driverClassName=org.postgresql.Driver

# connection pool
cp.maxActive=96
cp.maxIdle=16
cp.minIdle=0
cp.maxWait=60000

8. Ajoutez la bibliothèque de la base de données à utiliser à la dépendance du projet de domaine.

Dans l'état initial, les paramètres d'Oracle et de PostgreSQL sont décrits dans un état commenté. Décommentez PostgreSQL et activez-le.

Avant correction


        <!-- == Begin Database == -->
<!--         <dependency> -->
<!--             <groupId>org.postgresql</groupId> -->
<!--             <artifactId>postgresql</artifactId> -->
<!--             <scope>test</scope> -->
<!--         </dependency> -->
<!--         <dependency> -->
<!--             <groupId>com.oracle</groupId> -->
<!--             <artifactId>ojdbc7</artifactId> -->
<!--             <scope>test</scope> -->
<!--         </dependency> -->
        <!-- == End Database == -->

modifié


        <!-- == Begin Database == -->
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
             <scope>test</scope>
         </dependency>
<!--         <dependency> -->
<!--             <groupId>com.oracle</groupId> -->
<!--             <artifactId>ojdbc7</artifactId> -->
<!--             <scope>test</scope> -->
<!--         </dependency> -->
        <!-- == End Database == -->

9. (Facultatif) Modifiez le projet initdb

Le projet initdb contient également des informations de connexion à la base de données. Cependant, puisque le projet initdb lui-même est destiné à la construction initiale de la base de données, il n'est pas nécessaire de le modifier si vous n'utilisez pas initdb. Les parties à modifier sont «<db.url>, <db.username> et <db.password>» qui définissent les informations de connexion de la base de données.

Avant correction


        <profile>
            <id>local-postgres</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <db.encoding>UTF8</db.encoding>
                <db.basedir>${project.basedir}/src/main/sqls/postgres</db.basedir>
                <db.url>jdbc:postgresql://127.0.0.1:5432/projectName</db.url>
                <db.username>postgres</db.username>
                <db.password>P0stgres</db.password>
                <db.driver>org.postgresql.Driver</db.driver>
                <db.groupId>org.postgresql</db.groupId>
                <db.artifactId>postgresql</db.artifactId>
                <db.version>${postgresql.version}</db.version>
                <db.delimiterType>row</db.delimiterType>
            </properties>
        </profile>

modifié


        <profile>
            <id>local-postgres</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <db.encoding>UTF8</db.encoding>
                <db.basedir>${project.basedir}/src/main/sqls/postgres</db.basedir>
                <db.url>jdbc:postgresql://127.0.0.1:5432/demodb</db.url>
                <db.username>demoUser</db.username>
                <db.password>demoPass</db.password>
                <db.driver>org.postgresql.Driver</db.driver>
                <db.groupId>org.postgresql</db.groupId>
                <db.artifactId>postgresql</db.artifactId>
                <db.version>${postgresql.version}</db.version>
                <db.delimiterType>row</db.delimiterType>
            </properties>
        </profile>

10. (Facultatif) Créez une base de données à l'aide du projet initdb

10.1. Création de DDL pour la construction de la base de données

Le DDL utilisé pour la construction de la base de données est stocké dans le répertoire spécifié par «<db.basedir>» ci-dessus. Dans ce cas, ce sera C: \ work \ demo-database-postgresql \ demo-database-postgresql-initdb \ src \ main \ sqls \ postgres. Créez ce répertoire car il n'existe pas par défaut.

Numéro d'article nom de fichier Remarques
1 00000_drop_all_tables.sql Un fichier qui décrit le DDL qui supprime la table.
2 00100_create_all_tables.sql Un fichier qui décrit le DDL qui crée les tables requises.
3 00200_insert_employee.sql Il s'agit d'un fichier qui décrit le SQL qui enregistre les données initiales d'une table spécifique (employé).

Puisque les fichiers sont triés par nom de fichier et exécutés séquentiellement, les noms de fichier sont donnés en tenant compte de l'ordre d'exécution. Je ne l'ai pas créé cette fois, mais si nécessaire, préparez un DDL pour créer une séquence ou un index.

00000_drop_all_tables.sql



DROP TABLE IF EXISTS employee;

00100_create_all_tables.sql



--Table des employés--
CREATE TABLE employee (
    --ID d'employé
    employee_id    varchar(10)    NOT NULL,
    --Nom complet
    name           varchar(30)    NOT NULL,
    --Date d'embauche
    register_date  date           NOT NULL,
    --point
    point          numeric(3,0)   NOT NULL,
    --Contrainte de clé primaire
    CONSTRAINT EMPLOYEE_PK PRIMARY KEY(employee_id)
);

00200_insert_employee.sql



INSERT INTO employee (employee_id, name, register_date, point) VALUES ('0000000777', 'Examen Taro', to_date('2016/04/01', 'yyyy/MM/dd'), 10);
COMMIT;

10.2. Construire la base de données avec mvn sql: exécuter la commande

Lorsque la commande mvn sql: execute est exécutée dans le projet initdb, le DDL préparé ci-dessus est exécuté et la base de données est construite et initialisée.

Résultat d'exécution


C:\work\demo-database-postgresql\demo-database-postgresql-initdb>mvn sql:execute
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building demo-database-postgresql-initdb 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- sql-maven-plugin:1.5:execute (default-cli) @ demo-database-postgresql-initdb ---
[INFO] Executing file: C:\work\demo-database-postgresql\demo-database-postgresql-initdb\src\main\sqls\postgres\00000_dro
p_all_tables.sql
[INFO] Executing file: C:\work\demo-database-postgresql\demo-database-postgresql-initdb\src\main\sqls\postgres\00100_cre
ate_all_tables.sql
[INFO] Executing file: C:\work\demo-database-postgresql\demo-database-postgresql-initdb\src\main\sqls\postgres\00200_ins
ert_employee.sql
[INFO] 3 of 3 SQL statements executed successfully
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.217 s
[INFO] Finished at: 2017-08-31T10:56:24+09:00
[INFO] Final Memory: 8M/20M
[INFO] ------------------------------------------------------------------------

C:\work\demo-database-postgresql\demo-database-postgresql-initdb>

Cochez «3 instructions SQL sur 3 exécutées avec succès» et «BUILD SUCCESS» pour vous assurer qu'elle s'est déroulée correctement.

11. Version d'essai

De nombreux fichiers de configuration ont été modifiés pour prendre en charge PostgreSQL. Effectuez une version d'essai pour rechercher d'éventuelles lacunes.

Résultat d'exécution


C:\work\demo-database-postgresql>mvn package
[INFO] Scanning for projects...

...réduction...

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] TERASOLUNA Server Framework for Java (5.x) Web Blank Multi Project (MyBatis3) SUCCESS [  0.015 s]
[INFO] demo-database-postgresql-env ....................... SUCCESS [  1.248 s]
[INFO] demo-database-postgresql-domain .................... SUCCESS [  0.359 s]
[INFO] demo-database-postgresql-web ....................... SUCCESS [  4.883 s]
[INFO] demo-database-postgresql-initdb .................... SUCCESS [  0.031 s]
[INFO] demo-database-postgresql-selenium .................. SUCCESS [  2.090 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.048 s
[INFO] Finished at: 2017-08-31T10:57:46+09:00
[INFO] Final Memory: 35M/84M
[INFO] ------------------------------------------------------------------------

C:\work\demo-database-postgresql>

Si «BUILD SUCCESS» s'affiche, il a été confirmé qu'il n'y avait aucun défaut dans les pièces trouvées au moment de la construction.

12. Début de l'essai

Si la version d'essai est terminée normalement C: \ work \ demo-database-postgresql \ demo-database-postgresql-web \ target \ demo-database-postgresql-web.war existe. Copiez et déployez demo-database-postgresql-web.war dans le répertoire d'installation de Tomcat / webapps.

Exécutez Répertoire d'installation de Tomcat / bin / startup.bat pour démarrer Tomcat. Accédez à http: // localhost: 8080 / demo-database-postgresql-web / avec un navigateur Web, et si l'écran par défaut "Hello world!" Est affiché, il réussit.

13. Enfin

Cette fois, j'ai expliqué comment changer le projet vierge de TERASOLUNA 5.x pour prendre en charge PostgreSQL. Normalement, la base de données à utiliser n'est définie que lors de la première création du projet, donc je pense qu'il y a peu de possibilités de le faire. Cependant, si les paramètres initiaux du projet ne sont pas terminés, nous ne serons pas en mesure de procéder au développement de l'application (processus métier), nous souhaitons donc réagir rapidement.

Recommended Posts

Comment modifier un projet vierge de TERASOLUNA 5.x pour prendre en charge PostgreSQL
Comment supprimer des tuiles d'un projet vierge dans TERASOLUNA 5.x
Comment faire un projet Maven
Passer de SQLite3 à PostgreSQL dans un nouveau projet Ruby on Rails
[1st] Comment créer un projet de framework Spring-MVC
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
Comment changer une chaîne dans un tableau en un nombre dans Ruby
Comment laisser un commentaire
Passer de SQLite3 à PostgreSQL
Comment insérer une vidéo
Comment créer une méthode
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
Comment réaliser un téléchargement de fichiers volumineux avec TERASOLUNA 5.x (= Spring MVC)
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03
[chown] Comment changer le propriétaire d'un fichier ou d'un répertoire
Comment créer un conteneur Java
Comment signer Minecraft MOD
Comment configurer Spring Boot + PostgreSQL
Comment créer un pilote JDBC
Comment changer kube-proxy en mode ipvs.
[Swift] Comment envoyer une notification
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment créer un tableau Java
Comment passer du HTML à Haml
Vous ne pouvez pas changer la version de facette du projet d'un module Web dynamique à x.x. Comment faire avec
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
Comment exécuter un contrat avec web3j
Comment trier une liste à l'aide du comparateur
Comment créer un résumé de calendrier Java
Un mémorandum sur l'utilisation d'Eclipse
Comment changer le nom de l'application dans les rails
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment insérer une vidéo dans Rails
Comment ajouter un nouveau hachage / tableau
[Introduction à Java] Comment écrire un programme Java
Comment créer un référentiel Maven pour 2020
Comment créer un robot Discord (Java)
Comment créer SquashTM et comment prendre en charge le japonais
[Swift5] Comment créer un écran de démarrage
[rails] Comment créer un modèle partiel
[Rails 5.x] Comment introduire des polices gratuites
Comment publier une bibliothèque dans jCenter
[SpringBoot] Comment écrire un test de contrôleur