更新时间:2024-02-07 GMT+08:00
分享

通过JDBC连接池连接DDM

操作场景

连接池实现原理:在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,发出请求,直接从连接池中取出一个已建立的空闲连接对象。使用完毕后,再将连接放回连接池中,供下一个请求访问使用。连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过系统自身的管理机制来监视数据库连接的数量、使用情况等。

本章节主要介绍了如何通过JDBC连接池与DDM对接,实现数据操作。如果是Java程序,建议您使用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_type

    varchar(45)

    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(); 
            } 
        } 
    }

相关文档