zoukankan      html  css  js  c++  java
  • 连接数据库,使用c3p0技术连接MySQL数据库

    读取配置文件连接MySQL数据库

    先确认已经导入了 mysql 的驱动包

    db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/v20?useUnicode=true&characterEncoding=utf8
    username=root
    password=123456
    

    JdbcUtil.java

    package com.stu_mvc.utils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
    
    
    public class JdbcUtil {
    
    	private static String CLASS_DRIVER = "";
    	private static String URL = "";
    	private static String USERNAME = "";
    	private static String PASSWORD = "";
    
    	static {
    		Properties properties = new Properties();
    		try {
                //读取上面的配置文件
    			properties.load(JdbcUtil.class.getResourceAsStream("/db.properties"));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		CLASS_DRIVER = properties.getProperty("driver");
    		URL = properties.getProperty("url");
    		USERNAME = properties.getProperty("username");
    		PASSWORD = properties.getProperty("password");
    		try {
    			Class.forName(CLASS_DRIVER);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    
        /**
         *	getConn()
         *	获取conn
         */
    	public static Connection getConn() {
    		Connection conn = null;
    		try {
    			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    		} catch (SQLException e) {
    
    			e.printStackTrace();
    		}
    		return conn;
    
    	}
    
    	/**
    	 * 利用泛型改进释放资源 rs,st,conn
    	 */
    	public static <T extends AutoCloseable> void closeAll(T... autos) {
    		for (AutoCloseable t : autos) {
    			if (t != null) {
    				try {
    					t.close();
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    
    

    使用 c3p0数据库连接池连接MySQL

    普通的数据库连接创建的缺点:

    用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。

    数据库连接池概念

    所谓数据库连接池,可以看作 :在用户和数据库之间创建一个”池”,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。一旦连接池中的连接对象被拿光了,下一个想要操作数据库的用户必须等待,等待其他用户释放连接对象,把它放回连接池中,这时候等待的用户才能获取连接对象,从而操作数据库。

    下载C3P0工具包

    C3P0工具包包含的版本:

    • c3p0-0.9.5.2

    • mchange-commons-java-0.2.11

    c3p0-config.xml 的配置

    **注意: ** xml 配置文件的名称必须是:c3p0-config.xml ,也是放在src 目录下

    这里的 jdbcUrl 比较容易出问题,要是出现问题,建议仔细找找。

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    	<!-- 文件名字是固定的,连接池会找到这个配置文件进行配置 -->
    	<default-config>
    		<!--第一条内容是固定的-->
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<!--最后一项改成你的数据库名字即可,我这里之前总是连接不上,改成三个 /// 后发现连接成功-->
    		<property name="jdbcUrl">jdbc:mysql:///v20</property>
    		<!--mysql的用户名和密码-->
    		<property name="user">root</property>
    		<property name="password">123456</property>
    	</default-config>
    </c3p0-config>
    

    JdbcUtil.java

    写一个封装的工具类,开发起来还不是美滋滋!

    package com.register_mvc.utils;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import com.mchange.v2.c3p0.impl.DbAuth;
    
    public class JdbcUtil {
        // 创建 c3p0 连接池对象
        static ComboPooledDataSource dataSource = new ComboPooledDataSource("v20");
        //创建一个 ThreadLocal 
        static ThreadLocal<Connection> th = new ThreadLocal<Connection>();
    
        /**
         *	getConn()
         *	获取conn
         */
        public static Connection getConn() {
            // 从连接池中获取连接
            // 先从 th 中获取,如果为空再到连接池中获取
            Connection conn = th.get();
            if (conn == null) {
                try {
                    //把 获取的conn 存到 ThreadLocal 中
                    // ThreadLocal 内部有个map
                    // 通过当前的 线程 作为 key  value 是存的内容 
                    // 统一线程  key一致  value值 肯定一致  
                    conn = dataSource.getConnection();
                    //把 conn存到th中 
                    th.set(conn);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            return conn;
        }
    
    	/**
    	 * 利用泛型方法释放资源 rs,st,conn
    	 */
    	public static <T extends AutoCloseable> void closeAll(T... autos) {
    		for (AutoCloseable t : autos) {
    			if (t != null) {
    				try {
    					t.close();
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    
  • 相关阅读:
    第九周周记
    第七周周记
    第三次作业第一题
    第五周周记
    《世界是数字的》读后感想
    第十周周记
    迷茫
    测试作业
    价值观作业
    作业二 感想
  • 原文地址:https://www.cnblogs.com/zhiwenxi/p/11608121.html
Copyright © 2011-2022 走看看