diff --git a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/MultiDatasourceProperties.java b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/MultiDatasourceProperties.java new file mode 100644 index 00000000..28970ea0 --- /dev/null +++ b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/MultiDatasourceProperties.java @@ -0,0 +1,66 @@ +package tech.powerjob.server.persistence.config; + +import com.google.common.collect.Maps; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 多重数据源配置 + * + * @author Kung Yao + * @since 2020/4/27 + */ +@Component +@ConfigurationProperties("spring.datasource") +public class MultiDatasourceProperties { + + private DataSourceProperties remote = new DataSourceProperties(); + + private DataSourceProperties local = new DataSourceProperties(); + + + public static class DataSourceProperties { + + private HibernateProperties hibernate = new HibernateProperties(); + + public void setHibernate(HibernateProperties hibernate) { + this.hibernate = hibernate; + } + + public HibernateProperties getHibernate() { + return hibernate; + } + } + + + public static class HibernateProperties { + + private Map properties = Maps.newHashMap(); + + public void setProperties(Map properties) { + this.properties = properties; + } + + public Map getProperties() { + return properties; + } + } + + public void setLocal(DataSourceProperties local) { + this.local = local; + } + + public void setRemote(DataSourceProperties remote) { + this.remote = remote; + } + + public DataSourceProperties getLocal() { + return local; + } + + public DataSourceProperties getRemote() { + return remote; + } +} diff --git a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/RemoteJpaConfig.java b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/RemoteJpaConfig.java index bb1290fa..3bc52603 100644 --- a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/RemoteJpaConfig.java +++ b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/RemoteJpaConfig.java @@ -39,10 +39,13 @@ public class RemoteJpaConfig { @Resource(name = "omsRemoteDatasource") private DataSource omsRemoteDatasource; + @Resource(name = "multiDatasourceProperties") + private MultiDatasourceProperties properties; + public static final String CORE_PACKAGES = "tech.powerjob.server.persistence.remote"; /** - * 生成配置文件,包括 JPA配置文件和Hibernate配置文件,相当于一下三个配置 + * 生成配置文件,包括 JPA配置文件和Hibernate配置文件,相当于以下三个配置 * spring.jpa.show-sql=false * spring.jpa.open-in-view=false * spring.jpa.hibernate.ddl-auto=update @@ -67,10 +70,11 @@ public class RemoteJpaConfig { @Primary @Bean(name = "remoteEntityManagerFactory") public LocalContainerEntityManagerFactoryBean initRemoteEntityManagerFactory(EntityManagerFactoryBuilder builder) { - + Map datasourceProperties = genDatasourceProperties(); + datasourceProperties.putAll(properties.getRemote().getHibernate().getProperties()); return builder .dataSource(omsRemoteDatasource) - .properties(genDatasourceProperties()) + .properties(datasourceProperties) .packages(CORE_PACKAGES) .persistenceUnit("remotePersistenceUnit") .build(); diff --git a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/dialect/PowerJobPGDialect.java b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/dialect/PowerJobPGDialect.java new file mode 100644 index 00000000..6a197abc --- /dev/null +++ b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/config/dialect/PowerJobPGDialect.java @@ -0,0 +1,30 @@ +package tech.powerjob.server.persistence.config.dialect; + +import org.hibernate.dialect.PostgreSQL10Dialect; +import org.hibernate.type.descriptor.sql.LongVarcharTypeDescriptor; +import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; + +import java.sql.Types; + +/** + * @author Kung Yao + * @author Echo009 + * 2021/3/24 下午 04:23 + * 1074_King + */ +public class PowerJobPGDialect extends PostgreSQL10Dialect { + + /** + * 使用 {@link Types#LONGVARCHAR} 覆盖 {@link Types#CLOB} 类型 + * + * 注意,如果在 PG 库创建表时使用的列类型为 oid ,那么这样会导致没法正确读取数据 + * 在 PowerJob 中能这样用是因为 PowerJob 的所有实体类中被 @Lob 注解标记的列对应数据库中的字段类型都是 text + * 另外还需要注意数据库版本,如果是 10.x 以前的,需自行提供一个合适的 Dialect 类(选择合适的版本继承) + * + * 更多内容请关注该 issues:https://github.com/PowerJob/PowerJob/issues/153 + */ + @Override + public SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) { + return Types.CLOB == sqlCode ? LongVarcharTypeDescriptor.INSTANCE : null; + } +} diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/application-daily.properties b/powerjob-server/powerjob-server-starter/src/main/resources/application-daily.properties index bb286003..ced95d49 100644 --- a/powerjob-server/powerjob-server-starter/src/main/resources/application-daily.properties +++ b/powerjob-server/powerjob-server-starter/src/main/resources/application-daily.properties @@ -9,6 +9,10 @@ spring.datasource.core.password=No1Bug2Please3! spring.datasource.core.hikari.maximum-pool-size=20 spring.datasource.core.hikari.minimum-idle=5 +####### Fix issue 153 for PostgreSQL users, see https://github.com/PowerJob/PowerJob/issues/153#issuecomment-812771783 for more information ####### +####### Notice, the configuration below only supports PostgreSQL 10.x and later ####### +# spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect + ####### MongoDB properties(Non-core configuration properties) ####### ####### configure oms.mongodb.enable=false to disable mongodb ####### oms.mongodb.enable=true diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/application-pre.properties b/powerjob-server/powerjob-server-starter/src/main/resources/application-pre.properties index c3ed2054..f483a25f 100644 --- a/powerjob-server/powerjob-server-starter/src/main/resources/application-pre.properties +++ b/powerjob-server/powerjob-server-starter/src/main/resources/application-pre.properties @@ -9,6 +9,10 @@ spring.datasource.core.password=No1Bug2Please3! spring.datasource.core.hikari.maximum-pool-size=20 spring.datasource.core.hikari.minimum-idle=5 +####### Fix issue 153 for PostgreSQL users, see https://github.com/PowerJob/PowerJob/issues/153#issuecomment-812771783 for more information ####### +####### Notice, the configuration below only supports PostgreSQL 10.x and later ####### +# spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect + ####### MongoDB properties(Non-core configuration properties) ####### ####### configure oms.mongodb.enable=false to disable mongodb ####### oms.mongodb.enable=true diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/application-product.properties b/powerjob-server/powerjob-server-starter/src/main/resources/application-product.properties index 493a6abb..419f3bb7 100644 --- a/powerjob-server/powerjob-server-starter/src/main/resources/application-product.properties +++ b/powerjob-server/powerjob-server-starter/src/main/resources/application-product.properties @@ -9,6 +9,10 @@ spring.datasource.core.password=No1Bug2Please3! spring.datasource.core.hikari.maximum-pool-size=20 spring.datasource.core.hikari.minimum-idle=5 +####### Fix issue 153 for PostgreSQL users, see https://github.com/PowerJob/PowerJob/issues/153#issuecomment-812771783 for more information ####### +####### Notice, the configuration below only supports PostgreSQL 10.x and later ####### +# spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect + ####### MongoDB properties(Non-core configuration properties) ####### ####### configure oms.mongodb.enable=false to disable mongodb ####### oms.mongodb.enable=true