
# 通过JDBC连接池连接DDM
#### 操作场景
**连接池实现原理：**在系统初始化的时候，将数据库连接作为对象存储在内存中，当用户需要访问数据库时，发出请求，直接从连接池中取出一个已建立的空闲连接对象。使用完毕后，再将连接放回连接池中，供下一个请求访问使用。连接的建立、断开都由连接池自身来管理。同时，还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过系统自身的管理机制来监视数据库连接的数量、使用情况等。
本章节主要介绍了如何通过JDBC连接池与DDM对接，实现数据操作。如果是Java程序，建议您使用[HikariCP](https://github.com/brettwooldridge/HikariCP)。
- Java 8：建议使用3.3.1版本。
- Java 7：建议使用2.4.13版本。
- JDBC连接DDM不支持开启用户游标提取（useCursorFetch）参数。
 
#### 操作步骤
1. 配置Maven。 
   - Java 8：
     ```
     <dependency>
         <groupId>com.zaxxer</groupId>
         <artifactId>HikariCP</artifactId>
         <version>3.3.1</version>
     </dependency>
     ```
     
   
   - Java 7：
     ```
     <dependency>
         <groupId>com.zaxxer</groupId>
         <artifactId>HikariCP-java7</artifactId>
         <version>2.4.13</version>
     </dependency>
     ```
     
   
   
   
   
2. 创建表。 
   表1创建表。 
   | 表名      | 字段             | 类型          | 是否主键 |
   |:---|:---|:---|:---|
   | account | account_number | bigint      | 是    |
   | account | account_type   | varchar（45） | 否    |
   | account | account_name   | varchar（50） | 否    |
      
   
   
3. 连接DDM实例。 
   1. 配置连接数：JdbcUrl连接串中的参数和HikariCP参数。
   
   2. 插入数据。
   
   
   示例：
   ```
   import java.sql.Connection; 
   import java.sql.PreparedStatement; 
   import java.sql.ResultSet; 
   import java.sql.SQLException; 
   import javax.sql.DataSource; 
   import com.zaxxer.hikari.HikariConfig; 
   import com.zaxxer.hikari.HikariDataSource; 
   // 认证用的用户名和密码直接写到代码中有很大的安全风险，建议在配置文件或者环境变量中存放(密码应密文存放，使用时解密)，确保安全。
   // 本示例以用户名和密码保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
   public class HikariCPDemo { 
       private static DataSource datasource; 
       private static DataSource getDataSource() { 
           if (datasource == null) { 
               HikariConfig config = new HikariConfig(); 
               
               // 配置JdbcUrl连接串中的参数
               config.setJdbcUrl("jdbc:mysql:loadbalance://192.168.0.10:5066,192.168.0.11:5066/db_name?loadBalanceAutoCommitStatementThreshold=5&loadBalanceHostRemovalGracePeriod=15000&loadBalanceBlacklistTimeout=60000&loadBalancePingTimeout=5000&retriesAllDown=10&connectTimeout=10000"); 
               /* 
               // 配置JdbcUrl连接串中的参数也可以通过以下方法进行： 
               config.addDataSourceProperty("loadBalanceAutoCommitStatementThreshold",5); 
               config.addDataSourceProperty("loadBalanceHostRemovalGracePeriod", 15000); 
               config.addDataSourceProperty("loadBalanceBlacklistTimeout", 60000); 
               config.addDataSourceProperty("loadBalancePingTimeout", 5000); 
               config.addDataSourceProperty("retriesAllDown", 10); 
               config.addDataSourceProperty("connectTimeout", 10000); 
               */ 
               config.setUsername("EXAMPLE_USERNAME_ENV"); 
               config.setPassword("EXAMPLE_PASSWORD_ENV"); 
               config.setMaximumPoolSize(10); 
               config.setAutoCommit(true); 
               // 配置HikariCP参数 
               config.addDataSourceProperty("cachePrepStmts", true); 
               config.addDataSourceProperty("prepStmtCacheSize", 250); 
               config.addDataSourceProperty("prepStmtCacheSqlLimit", 2048); 
               config.addDataSourceProperty("minimumIdle", 5); 
               config.addDataSourceProperty("maximumPoolSize", 10); 
               config.addDataSourceProperty("idleTimeout", 30000); 
               datasource = new HikariDataSource(config); 
           } 
           return datasource; 
       } 
       public static void main(String[] args) { 
           Connection connection = null; 
           PreparedStatement pstmt = null; 
           ResultSet resultSet = null; 
           try { 
               DataSource dataSource = getDataSource(); 
               connection = dataSource.getConnection(); 
               System.out.println("The Connection Object is of Class: " + connection.getClass()); 
               // 开启事务
               connection.setAutoCommit(false);
               // 插入测试数据
               String insertSql = "insert into account(account_number, account_type, account_name) values(?, ?, ?);";
               PreparedStatement insertStmt = connection.prepareStatement(insertSql);
               insertStmt.setLong (1, 1L); 
               insertStmt.setString (2, "manager"); 
               insertStmt.setString (3, "demotest01"); 
               insertStmt.executeUpdate(); 
               connection.commit ();
               // 查询数据
               pstmt = connection.prepareStatement("SELECT * FROM account"); 
               resultSet = pstmt.executeQuery(); 
               while (resultSet.next()) { 
                   String accountNumber = resultSet.getString("account_number"); 
                   String accountType = resultSet.getString("account_type"); 
                   String accountName = resultSet.getString("account_name"); 
                   System.out.println(accountNumber + "," + accountType + "," + accountName); 
               } 
           } catch (Exception e) { 
               try { 
                   if (null != connection) { 
                       connection.rollback(); 
                   } 
               } catch (SQLException e1) { 
                   e1.printStackTrace(); 
               } 
               e.printStackTrace(); 
           } 
       } 
   }
   ```
   
   
 
