From a96f003b8c899093c8073c59da31d0fb10a38476 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Fri, 3 Mar 2017 11:45:55 +0800 Subject: [PATCH] --- src/org/redkale/source/DataDefaultSource.java | 94 +----------------- src/org/redkale/source/EntityInfo.java | 9 +- src/org/redkale/source/JDBCPoolSource.java | 95 ++++++++++++++++++- 3 files changed, 98 insertions(+), 100 deletions(-) diff --git a/src/org/redkale/source/DataDefaultSource.java b/src/org/redkale/source/DataDefaultSource.java index f3acd4b40..96daad3f0 100644 --- a/src/org/redkale/source/DataDefaultSource.java +++ b/src/org/redkale/source/DataDefaultSource.java @@ -6,7 +6,6 @@ package org.redkale.source; import java.io.*; -import java.lang.reflect.Method; import java.net.URL; import java.sql.*; import java.util.*; @@ -14,11 +13,11 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.*; import java.util.logging.*; import javax.annotation.Resource; -import javax.sql.ConnectionPoolDataSource; import javax.xml.stream.*; import org.redkale.util.*; /** + * DataSource的JDBC实现类 * *

* 详情见: https://redkale.org @@ -30,26 +29,6 @@ public final class DataDefaultSource implements DataSource, Function { this.cache = null; } if (conf == null) conf = new Properties(); - this.containSQL = conf.getProperty(JDBC_CONTAIN_SQLTEMPLATE, "LOCATE(${keystr}, ${column}) > 0"); - this.notcontainSQL = conf.getProperty(JDBC_NOTCONTAIN_SQLTEMPLATE, "LOCATE(${keystr}, ${column}) = 0"); + this.containSQL = conf.getProperty(JDBCPoolSource.JDBC_CONTAIN_SQLTEMPLATE, "LOCATE(${keystr}, ${column}) > 0"); + this.notcontainSQL = conf.getProperty(JDBCPoolSource.JDBC_NOTCONTAIN_SQLTEMPLATE, "LOCATE(${keystr}, ${column}) = 0"); - this.tablenotexistSqlstates = ";" + conf.getProperty(JDBC_TABLENOTEXIST_SQLSTATES, "42000;42S02") + ";"; - this.tablecopySQL = conf.getProperty(JDBC_TABLECOPY_SQLTEMPLATE, "CREATE TABLE ${newtable} LIKE ${oldtable}"); + this.tablenotexistSqlstates = ";" + conf.getProperty(JDBCPoolSource.JDBC_TABLENOTEXIST_SQLSTATES, "42000;42S02") + ";"; + this.tablecopySQL = conf.getProperty(JDBCPoolSource.JDBC_TABLECOPY_SQLTEMPLATE, "CREATE TABLE ${newtable} LIKE ${oldtable}"); } public void createPrimaryValue(T src) { diff --git a/src/org/redkale/source/JDBCPoolSource.java b/src/org/redkale/source/JDBCPoolSource.java index 9ec7bd52d..89cdc5f8e 100644 --- a/src/org/redkale/source/JDBCPoolSource.java +++ b/src/org/redkale/source/JDBCPoolSource.java @@ -27,6 +27,26 @@ import javax.sql.*; */ public class JDBCPoolSource { + static final String JDBC_CONNECTIONSMAX = "javax.persistence.connections.limit"; + + static final String JDBC_CONTAIN_SQLTEMPLATE = "javax.persistence.contain.sqltemplate"; + + static final String JDBC_NOTCONTAIN_SQLTEMPLATE = "javax.persistence.notcontain.sqltemplate"; + + static final String JDBC_TABLENOTEXIST_SQLSTATES = "javax.persistence.tablenotexist.sqlstates"; + + static final String JDBC_TABLECOPY_SQLTEMPLATE = "javax.persistence.tablecopy.sqltemplate"; + + static final String JDBC_URL = "javax.persistence.jdbc.url"; + + static final String JDBC_USER = "javax.persistence.jdbc.user"; + + static final String JDBC_PWD = "javax.persistence.jdbc.password"; + + static final String JDBC_DRIVER = "javax.persistence.jdbc.driver"; + + static final String JDBC_SOURCE = "javax.persistence.jdbc.source"; + private static final Map>>> maps = new HashMap<>(); private final AtomicLong usingCounter = new AtomicLong(); @@ -97,6 +117,77 @@ public class JDBCPoolSource { } } + static ConnectionPoolDataSource createDataSource(Properties property) { + try { + return createDataSource(property.getProperty(JDBC_SOURCE, property.getProperty(JDBC_DRIVER)), + property.getProperty(JDBC_URL), property.getProperty(JDBC_USER), property.getProperty(JDBC_PWD)); + } catch (Exception ex) { + throw new RuntimeException("(" + property + ") have no jdbc parameters", ex); + } + } + + static ConnectionPoolDataSource createDataSource(String source0, String url, String user, String password) throws Exception { + String source = source0; + if (source0 == null || source0.isEmpty()) { + if (url.startsWith("jdbc:mysql:")) { + source0 = "com.mysql.jdbc.Driver"; + } else if (url.startsWith("jdbc:mariadb:")) { + source0 = "org.mariadb.jdbc.Driver"; + } else if (url.startsWith("jdbc:oracle:")) { + source0 = "oracle.jdbc.driver.OracleDriver"; + } else if (url.startsWith("jdbc:postgresql:")) { + source0 = "org.postgresql.Driver"; + } else if (url.startsWith("jdbc:microsoft:sqlserver:")) { + source0 = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + } + } + if (source0 != null && source0.contains("Driver")) { //为了兼容JPA的配置文件 + switch (source0) { + case "org.mariadb.jdbc.Driver": + source = "org.mariadb.jdbc.MySQLDataSource"; + break; + case "com.mysql.cj.jdbc.Driver": + case "com.mysql.jdbc.Driver": + try { + Class.forName("com.mysql.cj.jdbc.MysqlConnectionPoolDataSource"); + source = "com.mysql.cj.jdbc.MysqlConnectionPoolDataSource"; + } catch (Exception e) { + source = "com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"; + } + break; + case "oracle.jdbc.driver.OracleDriver": + source = "oracle.jdbc.pool.OracleConnectionPoolDataSource"; + break; + case "org.postgresql.Driver": + source = "org.postgresql.ds.PGConnectionPoolDataSource"; + break; + case "com.microsoft.sqlserver.jdbc.SQLServerDriver": + source = "com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource"; + break; + } + } + final Class clazz = Class.forName(source); + Object pdsource = clazz.newInstance(); + if (source.contains(".postgresql.")) { + Class driver = Class.forName("org.postgresql.Driver"); + Properties properties = (Properties) driver.getMethod("parseURL", String.class, Properties.class).invoke(null, url, new Properties()); + clazz.getMethod("setServerName", String.class).invoke(pdsource, properties.getProperty("PGHOST")); + clazz.getMethod("setDatabaseName", String.class).invoke(pdsource, properties.getProperty("PGDBNAME")); + clazz.getMethod("setPortNumber", int.class).invoke(pdsource, Integer.parseInt(properties.getProperty("PGPORT", "5432"))); + } else { + Method seturlm; + try { + seturlm = clazz.getMethod("setUrl", String.class); + } catch (Exception e) { + seturlm = clazz.getMethod("setURL", String.class); + } + seturlm.invoke(pdsource, url); + } + clazz.getMethod("setUser", String.class).invoke(pdsource, user); + clazz.getMethod("setPassword", String.class).invoke(pdsource, password); + return (ConnectionPoolDataSource) pdsource; + } + final boolean isMysql() { return source != null && source.getClass().getName().contains(".mysql."); } @@ -109,10 +200,10 @@ public class JDBCPoolSource { return source != null && source.getClass().getName().contains(".sqlserver."); } - final boolean isPostgresql () { + final boolean isPostgresql() { return source != null && source.getClass().getName().contains(".postgresql."); } - + private void watch() throws IOException { if (dataSource.conf == null || dataSource.name == null) return; final String file = dataSource.conf.getFile();