一、前言
客户在计划将业务向云平台迁移,这些天也在测试将数据库由Oracle替换为开源的PostgrSQL。为什么选PostgreSQL?因为这是对应用程序代码修改最小的方案,没有之一!
PostgreSQL数据库的简要信息为:服务器loacalhost,端口5432,数据库projadm,用户名/密码:projadm/proj2013。
开始前,在https://jdbc.postgresql.org/download.html下载与JBoss版本和JDK版本匹配的JDBC驱动包,存放某目录(最好不含汉字或特殊字符,因为随后用到的jboss-cli对复制粘贴太差劲),假设为D:PostgreSQLpostgresql-42.1.4.jar。
二、JBoss EAP配置
1) 设置环境变量JBOSS_HOME
如果计算机上安装了多个JBoss,此步骤不可忽略,否则后续步骤更改的是该环境变量所指JBoss实例的配置,而很可能不是期望的应用项目。假设为D:JBOSS-EAP-7.0。
2) 打开一个cmd窗口,启动JBoss(假设为standalone模式):
cd D:JBOSS-EAP-7.0in
standalone.bat
3) 另外打开一个cmd窗口,在jboss-cli命令行增加PostgreSQL数据源相关设置:
cd D:JBOSS-EAP-7.0in
jboss-cli.bat
进入jboss-cli命令行模式后,依次执行:
#连接jboss实例 connect # 增加PostgreSQL模块 module add --name=com.postgresql --resources=D:PostgreSQLpostgresql-42.1.4.jar --dependencies=javax.api,javax.transaction.api # 增加jdbc-driver驱动描述 /subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=com.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource) # 增加jndi描述 data-source add --name=PostgresDS --jndi-name=java:jboss/PostgresDS --driver-name=postgresql --connection-url=jdbc:postgresql://localhost:5432/projadm --user-name=projadm --password=proj2013 --validate-on-match=true --background-validation=false --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter #删除Oracle数据源(OracleDS) data-source remove --name=OracleDS
三、检验
用文本编辑器打开D:JBOSS-EAP-7.0standaloneconfigurationstandalone.xml,会查找到关于PostgreSQL的jndi和driver的描述信息,内容大致为:
<profile> … <subsystem xmlns="urn:jboss:domain:datasources:4.0"> <datasources> <datasource jndi-name="java:jboss/PostgresDS" pool-name="PostgresDS"> <connection-url>jdbc:postgresql://localhost:5432/projadm</connection-url> <driver>postgresql</driver> <security> <user-name>projadm</user-name> <password>proj2013</password> </security> <validation> … </validation> </datasource> <drivers> … <driver name="postgresql" module="com.postgresql"> <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> </driver> </drivers> </datasources> </subsystem> … </profile>
此外,在D:JBoss-EAP-7.0modulescom目录多出postgresql文件夹,其下的main子文件夹包含驱动包postgresql-42.1.4.jar和module.xml配置文件,内容大致为:
<resources> <resource-root path="postgresql-42.1.4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies>
四、应用修改
这部分会因所使用的框架不同而有很大差异,只列出本项目所涉及到一些内容。
- maven工程修改pom,增加对驱动文件的依赖:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgresql.version}</version> </dependency>
- 某些情况下,可能需要手工拷贝驱动文件postgresql-42.1.4.jar到相应的lib目录;
- JPA工程修改persitense.xml,替换原来与Oracle有关的部分:
<persistence-unit name="jpaUnit" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- <jta-data-source>java:jboss/datasources/HSOracleDS</jta-data-source> --> <jta-data-source>java:jboss/PostgresDS</jta-data-source> <properties> <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" /> --> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> …
- 应用程序中涉及到的其它配置,具体项目具体分析吧;
- java代码中,除一些明显之处(如使用nvl函数、decode函数、sysdate)以外,令人更头疼的是类型匹配。由于PostgreSQL对类型匹配要求严格,不像Oracle那样默许decimal与varchar、decimal与boolean等相互间的隐式转换,需要修改Java代码或者调整表字段类型。