java jdbc 多数据源_多数据源使用jdbc连接数据库

问题提出

问题: 多数据源使用jdbc连接数据库,每次连接都是new新连接

for循环多次时new会导致连接创建失败

分析问题

使用数据库连接池技术解决重复创建的问题

具体实现

jdbc连接数据库

package com.keep.account.util;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class DbUtil {

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

try{

//

for(int i = 0; i < 3; i++) {

conn = MultiDataSourcePollUtil.getConnection("test");

// 执行查询

stmt = conn.createStatement();

String sql;

sql = "SELECT id, name FROM user WHERE id IN (1,2,3)";

ResultSet rs = stmt.executeQuery(sql);

// 展开结果集数据库

while (rs.next()) {

// 通过字段检索

int id = rs.getInt("id");

String name = rs.getString("name");

// 输出数据

System.out.print("ID: " + id);

System.out.print(", 站点名称: " + name);

System.out.print("\n");

}

// 完成后关闭

rs.close();

}

stmt.close();

conn.close();

}catch(SQLException se){

// 处理 JDBC 错误

se.printStackTrace();

}catch(Exception e){

// 处理 Class.forName 错误

e.printStackTrace();

}finally{

// 关闭资源

try{

if(stmt!=null) stmt.close();

}catch(SQLException se2){

}// 什么都不做

try{

if(conn!=null) conn.close();

}catch(SQLException se){

se.printStackTrace();

}

}

}

}

多数据源缓存(其中配置可拿出来作为参数传入)

package com.keep.account.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;

import java.sql.Connection;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

/**

* 多数据源datasource

*/

public class MultiDataSourcePollUtil {

private static Map dataSources = new ConcurrentHashMap<>();

private static ComboPooledDataSource getDataSource(String connName) {

ComboPooledDataSource dataSource = dataSources.get(connName);

if (dataSource == null) {

synchronized (MultiDataSourcePollUtil.class) {

dataSource = dataSources.get(connName);

if (dataSource == null) {

System.out.println("create datasource");

dataSource = createDataSource();

dataSources.put(connName, dataSource);

}

}

}

return dataSource;

}

private static ComboPooledDataSource createDataSource() {

// TODO: 2019/7/8 考虑配置让初始化类处理

String dbUrl = "jdbc:mysql://localhost:3306/privateTool?serverTimezone=GMT&useUnicode=true&characterEncoding=utf8&useSSL=false";

String dbUser = "***";

String dbPwd = "****";

String driver = "com.mysql.jdbc.Driver";

ComboPooledDataSource dataSource = new ComboPooledDataSource();

dataSource.setUser(dbUser);

dataSource.setPassword(dbPwd);

dataSource.setJdbcUrl(dbUrl);

try {

dataSource.setDriverClass(driver);

} catch (PropertyVetoException e) {

e.printStackTrace();

}

dataSource.setInitialPoolSize(10);

dataSource.setMinPoolSize(10);

dataSource.setMaxPoolSize(100);

dataSource.setMaxStatements(100);

dataSource.setMaxIdleTime(60);

dataSource.setAcquireIncrement(10);

return dataSource;

}

public static Connection getConnection(String connName) {

try {

ComboPooledDataSource dataSource = getDataSource(connName);

return dataSource.getConnection();

} catch (Exception e) {

throw new RuntimeException("can not get sms database connection ", e);

}

}

}

参考文献

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要查询数据库中的多条数据,可以使用 JDBC 中的 ResultSet 对象。 首先,需要使用 Java 中的 JDBC API 连接数据库,并执行查询语句。查询语句可以使用 SQL 语句的 SELECT 语句,例如: ``` SELECT * FROM table_name; ``` 这个查询语句将会返回表中的所有行和所有列。 接下来,使用 JDBC 中的 Statement 对象执行查询语句,并获取 ResultSet 对象: ``` Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table_name"); ``` ResultSet 对象包含了查询结果的所有行和列。可以使用 rs.next() 方法来逐一遍历 ResultSet 中的每一行数据,例如: ``` while (rs.next()) { String column1 = rs.getString("column1"); int column2 = rs.getInt("column2"); // ... } ``` 其中,rs.getString("column1") 和 rs.getInt("column2") 方法用于获取当前行中指定列的数据。可以根据需要获取 ResultSet 中的任意列数据,也可以选择只获取部分列的数据。 最后,使用完 ResultSet 对象后,需要调用 rs.close() 方法来释放资。完整示例代码如下: ``` try { // 连接数据库 Connection connection = DriverManager.getConnection(url, username, password); // 执行查询语句 Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table_name"); // 遍历查询结果 while (rs.next()) { String column1 = rs.getString("column1"); int column2 = rs.getInt("column2"); // ... } // 释放资 rs.close(); stmt.close(); connection.close(); } catch (SQLException e) { // 处理异常 e.printStackTrace(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值