JDBC(4)----------数据库连接池(dbcp连接)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-17 03:31   11   0

1、JDBC:是提供用来执行SQL语句的java API.步骤如下:加载驱动程序、与数据库建立连接、发送SQL语句、处理结果。

2、JTA:事务有提交和回滚两个概念。提交:所有的操作步骤都被完整的执行后,称为事务被提交。回滚:由于某一操作步骤执行失败,导致所有步骤都没有被提交,则事务必须回滚,即回到事务执行前的状态。

代码如下:

package henu.utils;
import java.sql.*;
public class DbUtil {
 /**
  * 声明连接数据库的信息,例如数据库URL、用户名、密码等
  */
 
 private static String url = "jdbc:mysql://localhost:3306/user";
 private static String user = "root";
 private static String password = "123";
 
 /**
  * 声明相关对象
  */
 private static Statement stmt = null;
 private static ResultSet rs = null;
 private static Connection conn = null;
 
 /**
  * 创建数据库链接
  */
 
 public static synchronized Connection getConnect() {
  try {
   //加载驱动
   Class.forName("com.mysql.jdbc.Driver");
   conn = DriverManager.getConnection(url, user, password);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return conn;
 }
 
 
 /**
  * 执行insert、update、delete语句
  * 
  * 返回int类型
  */
 
 public static int executeUpdate(String sql) {
  int result = 0;
  
  try {
   stmt = getConnect().createStatement();
   result = stmt.executeUpdate(sql);
   
  } catch (SQLException e) {
   
   e.printStackTrace();
  }
  return result;
 }
 /**
  * 执行select语句
  * 
  * 返回查询ResultSet的结果集
  */
 public static ResultSet executeQuery(String sql) {
  
  try {
   stmt = getConnect().createStatement();
   rs = stmt.executeQuery(sql);
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return rs;
 }
 
 /**
  * 执行动态的Sql语句
  * @param sql含有参数的动态Sql语句
  * @result 返回PreparedStatement对象
  */
 
 public static PreparedStatement executePrepareStatement(String sql) {
  PreparedStatement ps = null;
  try {
   ps = getConnect().prepareStatement(sql);
   
  } catch (Exception e) {
   
   e.printStackTrace();
  }
  
  return ps;
 }
 
 /**
  * 事务回滚
  */
 
 public static void rollback() {
  try {
   getConnect().rollback();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 /**
  * 关闭数据库
  */
 
 public static void close() {
  
   try {
    if(rs!=null)
     rs.close();
    if(stmt!=null)
     rs.close();
    if(conn!=null)
     conn.close();
    
   } catch (SQLException e) {
    e.printStackTrace();
   }
 }
 
 /**
  * 连接Sql Server 2008
  * 需要下载sqljdbc.jar
  * Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  * url = "jdbc:sqlserver://localhost:1433;DatabaseName = dbName"
  * 
  * 
  * 连接Oracle数据库
  * 加载驱动程序
  * DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
  * url = "jdbc:oracle:oci8:@user"
  *或者
  *Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
  *url = "jdbc:oracle:thin:@localhost:1512:user" 
  */
 
}

3、数据库连接池:在一个虚拟的池中预先建好一定数量的Connection对象等待客户端的连接,当客户端连接时则分配一个空闲的Connection对象给客户端连接数据库;当这个客户端请求结束时则将Connection对象归还给池中,用来等待下一个客户端的访问。独立于Web服务器的数据库连接池:dbcp方式

需要commons-dbcp-xxx.jar和commons-pool-xxx.jar

package henu.util;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/**
 * DBCP
 * @suqichang
 * 2017-10-20
 */
public class DbUtil {
 
 private static BasicDataSource dataSource = null;

 public static void init(){
  if (dataSource != null){
   try{
    dataSource.close();
   }catch(Exception e){
    e.printStackTrace();
   }
   dataSource = null;
  }
  
  try {
   Properties p = new Properties();
   //硬编码方式
   p.setProperty("driverClassName", "com.mysql.jdbc.Driver");
   p.setProperty("url", "jdbc:mysql://localhost:3306/webdisk");
   p.setProperty("username", "root");
   p.setProperty("password", "123456");
   p.setProperty("maxActive", "30");
   p.setProperty("maxIdle", "10");
   //读取配置文件
   //p.load(DbUtil.class.getClass().getResourceAsStream("/db.properties"));
   dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(p);
  } catch(Exception e) {
   e.printStackTrace();
  }
 }
 
 public static DataSource getDataSource()
 {
  if(dataSource == null) {
   init();
  }
  return dataSource;
 }
 
 public static synchronized Connection getConnection() {
  Connection con = null;
  if(dataSource == null) {
   init();
  }
  if(dataSource!=null) {
   try {
    con = dataSource.getConnection();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  return con;
 }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP