Im Anfangszustand des leeren Projekts von TERASOLUNA Server Framework für Java (5.x) wird h2db im Speicher als Datenbank verwendet. Dieses Mal möchte ich ein persönliches Memorandum darüber aufbewahren, wie die Datenbank auf PostgreSQL geändert wird.
Der Workflow zum Ändern eines leeren Projekts zur Unterstützung von PostgreSQL ist unten dargestellt. Dieses Mal verwenden wir den in der Anwendung vorbereiteten Verbindungspool anstelle des in der Datenquelle des Anwendungsservers (Servlet-Container) definierten Verbindungspools.
Artikelnummer | Arbeit | Überblick |
---|---|---|
1 | Ein leeres Projekt erstellen | Erstellen Sie ein leeres Projekt gemäß den TERASOLUNA-Richtlinien. |
2 | Vorbereiten der zu verwendenden Datenbank | Erstellen Sie eine Datenbank und einen Benutzer in PostgreSQL auf localhost. |
3 | Fügen Sie die Bibliothek der zu verwendenden Datenbank zur Abhängigkeit des übergeordneten POM hinzu | Fügen Sie eine Abhängigkeit hinzu, um den PostgreSQL-JDBC-Treiber zu laden. |
4 | Deaktivieren Sie den DB-Initialisierungsprozess, wenn Sie die Anwendung starten | Im Ausgangszustand ist die Verarbeitung der h2db-Datenbankinitialisierung festgelegt. Deaktivieren Sie sie daher. |
5 | (Optional) Deaktivieren Sie das Schreiben von JDBC-Protokollen mit log4jdbc | Deaktivieren Sie die Einstellung log4jdbc für das Debuggen. |
6 | Ändern Sie das Datenbankverbindungsziel | Stellen Sie die Verbindung zu der diesmal vorbereiteten Datenbank ein. |
7 | Fügen Sie die Bibliothek der zu verwendenden Datenbank zur Abhängigkeit des Domänenprojekts hinzu | Fügen Sie beim Testen der Domäne eine Abhängigkeit zum Laden des JDBC-Treibers hinzu. |
8 | (Optional) Ändern Sie das initdb-Projekt | Da initdb auch einen Einstellungsteil der Verbindungsinformationen der Datenbank enthält, korrigieren Sie dies. |
9 | (Optional) Erstellen Sie eine Datenbank mit dem initdb-Projekt | Erstellen der in 2 vorbereiteten Datenbank mit initdb,Initialisieren Sie den Prozess. |
10 | Testversion | 設定に不備がないことを確認するためTestversionを行います。 |
11 | Teststart | 設定に不備がないことを確認するためTeststartを行います。 |
Beschrieben in der veröffentlichten Richtlinie "3.1.2. Erstellen eines Entwicklungsprojekts" Erstellen Sie ein leeres Projekt gemäß dem oben beschriebenen Verfahren. Diesmal lauten die Projekteinstellungen wie folgt, und es wird ein leeres Projekt mit "C: \ work" als aktuellem Verzeichnis erstellt.
Artikelnummer | Artikel | Wert | Bemerkungen |
---|---|---|---|
1 | archetypeArtifactId | terasoluna-gfw-multi-web-blank-mybatis3-archetype | Erstellt mit einem Multiprojekt mit MyBatis |
2 | archetypeVersion | 5.3.0.RELEASE | Version ist 5.3.0 |
3 | groupId | com.example.demo.postgresql | |
4 | artifactId | demo-database-postgresql |
Erstellen Sie ein Projekt mit dem Befehl 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
Ausführungsergebnis
...Kürzung...
[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>
Es ist erfolgreich, wenn "BUILD SUCCESS" angezeigt wird und das von Artefakt-ID angegebene Verzeichnis "demo-database-postgresql" unter dem Verzeichnis "C: \ work" erstellt wird.
Erstellen Sie eine Datenbank und einen Benutzer, um sie zu verwenden, und bereiten Sie sie für DDL vor. Dieses Mal habe ich eine Datenbank in PostgreSQL vorbereitet, die in localhost mit den folgenden Einstellungen erstellt wurde.
Artikelnummer | Artikel | Wert |
---|---|---|
1 | Port-Nummer | 5432 |
2 | Name der Datenbank | demodb |
3 | Benutzeridentifikation | demoUser |
4 | Passwort | demoPass |
Im Ausgangszustand werden die Einstellungen von Oracle und PostgreSQL in einem auskommentierten Zustand beschrieben. Kommentieren Sie PostgreSQL aus und aktivieren Sie es.
C: \ work \ demo-database-postgresql \ pom.xml
Vor der Korrektur
<!-- == 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 == -->
Überarbeitet
<!-- == 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 == -->
Im Anfangszustand eines leeren Projekts wird die durch <jdbc: initialize-database> angegebene DDL-Datei ausgeführt, wenn der DI-Container gestartet wird, dh wenn die Anwendung gestartet wird.
Es ist notwendig, wenn eine In-Memory-Datenbank verwendet wird, aber ich denke, dass diese Funktion für allgemeine Webanwendungen nicht erforderlich ist.
Kommentieren Sie die Beschreibung von <jdbc: initialize-database>
aus und deaktivieren Sie sie.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-env \ src \ main \ resources \ META-INF \ spring \ demo-database-postgresql-env.xml
Vor der Korrektur
<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>
Überarbeitet
<!--
<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>
-->
Wenn Sie die Transaktion mit "@Transactional (readOnly = true)" schreibgeschützt machen, wird das Protokoll der Fehlermeldung ausgegeben, indem das Protokoll von log4jdbc geschrieben wird.
Protokoll der Ausgabefehlermeldungen
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:Sie können schreibgeschützte Eigenschaften während einer Transaktion nicht ändern.
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)
...Kürzung...
Es überrascht nicht, dass log4jdbc "Lesen / Schreiben" -Transaktionen erfordert, obwohl die Anwendung sie auf "Nur Lesen" gesetzt hat. Da die Fehlermeldung nur im Protokoll ausgegeben wird, wirkt sie sich nicht auf die Verarbeitung der Anwendung aus, aber ich persönlich kümmere mich darum, daher deaktiviere ich log4jdbc immer.
Es ist einfach zu deaktivieren. Entfernen Sie einfach die Bean-Definition in Log4jdbcProxyDataSource und ändern Sie die beanId-Datenquelle, um die dbcp2-Datenquelle anzugeben.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-env \ src \ main \ resources \ META-INF \ spring \ demo-database-postgresql-env.xml
Vor der Korrektur
<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>
Überarbeitet
<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>
-->
Dieses Mal verwenden wir den dbcp2-Verbindungspool in der Anwendung. Daher müssen Datenbankverbindungsinformationen (URL, Portnummer, Benutzer-ID, Kennwort usw.) in der Anwendung verwaltet werden. Standardmäßig ist es in TERASOLUNA 5.x in "*** infra.properties" definiert. Wenn Sie die Datenquelle des Anwendungsservers mit JNDI verwenden, werde ich dies zu einem anderen Zeitpunkt erläutern.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-env \ src \ main \ resources \ META-INF \ spring \ demo-database-postgresql-infra.properties
Vor der Korrektur
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
Überarbeitet
### 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
Im Ausgangszustand werden die Einstellungen von Oracle und PostgreSQL in einem auskommentierten Zustand beschrieben. Kommentieren Sie PostgreSQL aus und aktivieren Sie es.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-domain \ pom.xml
Vor der Korrektur
<!-- == 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 == -->
Überarbeitet
<!-- == 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 == -->
Das initdb-Projekt enthält auch Informationen zur Datenbankverbindung. Da das initdb-Projekt selbst für den anfänglichen Aufbau der Datenbank vorgesehen ist, muss es nicht geändert werden, wenn Sie initdb nicht verwenden. Die zu ändernden Teile sind <db.url>, <db.username> und <db.password>, die die Verbindungsinformationen der Datenbank festlegen.
C: \ work \ demo-database-postgresql \ demo-database-postgresql-initdb \ pom.xml
Vor der Korrektur
<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>
Überarbeitet
<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>
Die für die Datenbankerstellung verwendete DDL wird in dem oben durch "<db.basedir>" angegebenen Verzeichnis gespeichert. In diesem Fall ist es "C: \ work \ demo-database-postgresql \ demo-database-postgresql-initdb \ src \ main \ sqls \ postgres". Erstellen Sie dieses Verzeichnis, da es standardmäßig nicht vorhanden ist.
Artikelnummer | Dateiname | Bemerkungen |
---|---|---|
1 | 00000_drop_all_tables.sql | Eine Datei, die die DDL beschreibt, mit der die Tabelle gelöscht wird. |
2 | 00100_create_all_tables.sql | Eine Datei, die die DDL beschreibt, mit der die erforderlichen Tabellen erstellt werden. |
3 | 00200_insert_employee.sql | Dies ist eine Datei, die die SQL beschreibt, die die Anfangsdaten einer bestimmten Tabelle (eines Mitarbeiters) registriert. |
Da die Dateien nach Dateinamen sortiert und nacheinander ausgeführt werden, werden die Dateinamen unter Berücksichtigung der Ausführungsreihenfolge angegeben. Ich habe es diesmal nicht erstellt, aber bereiten Sie bei Bedarf eine DDL vor, um eine Sequenz oder einen Index zu erstellen.
00000_drop_all_tables.sql
DROP TABLE IF EXISTS employee;
00100_create_all_tables.sql
--Mitarbeitertabelle--
CREATE TABLE employee (
--Mitarbeiter-ID
employee_id varchar(10) NOT NULL,
--Vollständiger Name
name varchar(30) NOT NULL,
--Anstellungsdatum
register_date date NOT NULL,
--Punkt
point numeric(3,0) NOT NULL,
--Primärschlüsseleinschränkung
CONSTRAINT EMPLOYEE_PK PRIMARY KEY(employee_id)
);
00200_insert_employee.sql
INSERT INTO employee (employee_id, name, register_date, point) VALUES ('0000000777', 'Prüfung Taro', to_date('2016/04/01', 'yyyy/MM/dd'), 10);
COMMIT;
Wenn der Befehl mvn sql: execute
im initdb-Projekt ausgeführt wird, wird die oben vorbereitete DDL ausgeführt und die Datenbank erstellt und initialisiert.
Ausführungsergebnis
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>
Überprüfen Sie "3 von 3 erfolgreich ausgeführten SQL-Anweisungen" und "BUILD SUCCESS", um sicherzustellen, dass sie erfolgreich abgeschlossen wurden.
Viele Konfigurationsdateien wurden geändert, um PostgreSQL zu unterstützen. Führen Sie einen Testaufbau durch, um eventuelle Mängel festzustellen.
Ausführungsergebnis
C:\work\demo-database-postgresql>mvn package
[INFO] Scanning for projects...
...Kürzung...
[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>
Wenn "BUILD SUCCESS" angezeigt wird, wurde bestätigt, dass die zum Zeitpunkt der Erstellung gefundenen Teile keine Fehler aufweisen.
Wenn der Testbuild normal abgeschlossen ist C: \ work \ demo-database-postgresql \ demo-database-postgresql-web \ target \ demo-database-postgresql-web.war
ist vorhanden.
Kopieren Sie demo-database-postgresql-web.war
und stellen Sie es in das Tomcat-Installationsverzeichnis / webapps
bereit.
Führen Sie das Tomcat-Installationsverzeichnis / bin / startup.bat aus, um Tomcat zu starten. Greifen Sie mit einem Webbrowser auf http: // localhost: 8080 / demo-database-postgresql-web / zu. Wenn der Standardbildschirm "Hallo Welt!" Angezeigt wird, ist er erfolgreich.
Dieses Mal habe ich erklärt, wie das leere Projekt von TERASOLUNA 5.x geändert wird, um PostgreSQL zu unterstützen. Normalerweise wird die zu verwendende Datenbank nur beim ersten Erstellen des Projekts festgelegt, daher gibt es meines Erachtens nur wenige Möglichkeiten, dies zu tun. Wenn die anfänglichen Einstellungen des Projekts jedoch nicht abgeschlossen sind, können wir nicht mit der Entwicklung der Anwendung (Geschäftsprozess) fortfahren, daher möchten wir schnell reagieren.
Recommended Posts