通过JDBC连接池连接DDM
操作场景
连接池实现原理:在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,发出请求,直接从连接池中取出一个已建立的空闲连接对象。使用完毕后,再将连接放回连接池中,供下一个请求访问使用。连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过系统自身的管理机制来监视数据库连接的数量、使用情况等。
- Java 8:建议使用3.3.1版本。
- Java 7:建议使用2.4.13版本。
- JDBC连接DDM不支持开启用户游标提取(useCursorFetch)参数。
操作步骤
- 配置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>
- Java 8:
- 创建表。
表1 创建表。 表名
字段
类型
是否主键
account
account_number
bigint
是
account_type
varchar(45)
否
account_name
varchar(50)
否
- 连接DDM实例。
- 配置连接数:JdbcUrl连接串中的参数和HikariCP参数。
- 插入数据。
示例: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(); } } }