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.
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を行います。 |
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
.
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 |
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.
C: \ work \ demo-database-postgresql \ pom.xml
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 == -->
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>
.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-env \ src \ main \ resources \ META-INF \ spring \ demo-database-postgresql-env.xml
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>
-->
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.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-env \ src \ main \ resources \ META-INF \ spring \ demo-database-postgresql-env.xml
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>
-->
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.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-env \ src \ main \ resources \ META-INF \ spring \ demo-database-postgresql-infra.properties
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
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.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-domain \ pom.xml
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 == -->
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.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-initdb \ pom.xml
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>
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;
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.
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.
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.
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