七叶笔记 » java编程 » Java操作数据库——使用连接池连接数据库

Java操作数据库——使用连接池连接数据库

传统方式和连接池方式

传统方式的步骤

使用传统方式在Java中使用JDBC连接数据库,完成一次数据库的操作,一般有以下几个步骤:

1. 加载驱动。

2. 建立连接。

3. 执行SQL语句。

4. 释放连接。

5. 传统方式的弊端

每一次对数据库的操作都要建立一次连接,并且会将得到的Connection对象加载到内存中,导致消耗了大量的内存和时间。如果短时间有很多需要进行建立连接的操作,会导致占用很多系统资源,甚至会导致服务器崩溃。

同建立连接相对应,每次使用都需要手动释放连接,如果忘记释放连接或者程序出现异常未能成功释放,会导致内存泄露。

此外,传统方式并不能控制连接的数量,如果连接的人数过多,会导致无限制的创建连接对象,导致内存开销过大,服务器崩溃。

(推荐视频:java视频教程)

连接池的步骤

1. 创建连接池并配置连接属性。

2. 使用连接池获取连接。

连接池的优势

每次需要连接数据库时,不需要建立连接,而是通过连接池获取,由连接池提供连接。

在使用完连接后,不需要手动释放连接,而是交由连接池释放连接。

可以通过连接池控制连接的数量,在连接池里的连接可多次重复使用,避免了无限制创建连接的问题。

使用连接池

使用C3P0数据库连接池

导入jar包:

c3p0-0.9.5.2.jar

在当前项目的代码根目录 src 下新建名为 c3p0-config.xml 的配置文件,注意文件名称不可改变,内容如下:

<c3p0-config>    <!-- 连接名称 -->    <named-config name="mysql">        <!-- 接数据库的驱动类名 -->        <property name="driverClass">com.mysql.jdbc.Driver</property>        <!-- 连接属性 -->        <property name="jdbcUrl">jdbc:mysql://192.168.35.128:3306/demo</property>        <property name="user">root</property>        <property name="password">123456</property>        <!-- 当连接池用完时等待获取新连接的时间,超时后将抛出SQLException,单位毫秒,如设为0则无限期等待。默认为0。 -->        <property name="checkoutTimeout">5000</property>        <!-- 当连接用尽后,一次获取的连接个数 -->        <property name="acquireIncrement">2</property>        <!-- 初始连接数 -->        <property name="initialPoolSize">1</property>        <!-- 最小连接数 -->        <property name="minPoolSize">3</property>        <!-- 最大连接数 -->        <property name="maxPoolSize">5</property>    </named-config></c3p0-config>

程序代码:

public class TestDataPool {    // 根据配置文件里的名称创建连接池    public static ComboPooledDataSource cpds = new ComboPooledDataSource("mysql");        /**     * 主程序     */    public static void main(String[] args) {        // 模拟多次对数据库的查询操作        for (int i = 0; i < 6; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    select();                }            }, "线程" + i).start();        }    }        /**     * 查询程序     */    public static void select() {        Connection conn = null;        PreparedStatement pstmt = null;        ResultSet rs = null;        // 获取连接并执行SQL        try {            conn = cpds.getConnection();            pstmt = conn.prepareStatement("select * from student where id = 906");            rs = pstmt.executeQuery();            while (rs.next()) {                System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));            }        } catch (Exception e) {            e.printStackTrace();        } finally {            // 释放资源            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }            try {                pstmt.close();            } catch (SQLException e) {                e.printStackTrace();            }            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

使用DBCP数据库连接池

导入jar包:

 commons-dbcp-1.4.jar2 commons-pool-1.5.5.jar

在当前项目的代码根目录 src 下新建名为 dbcp.properties 的配置文件,文件名需要同代码中引用的文件名一致,内容如下:

# 接数据库的驱动类名driverClassName=com.mysql.jdbc.Driver# 连接属性url=jdbc:mysql://192.168.35.128:3306/demousername=rootpassword=123456# 初始化连接数initialSize=10# 最大连接数maxActive=15

程序代码:

public class TestDBCP {    // 根据配置文件里的名称创建连接池    private static DataSource source = null;    static {        Properties pros = new Properties();        InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");        try {            pros.load(is);            source = BasicDataSourceFactory.createDataSource(pros);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 主程序     */    public static void main(String[] args) {        // 模拟多次对数据库的查询操作        for (int i = 0; i < 6; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    select();                }            }, "线程" + i).start();        }    }    /**     * 查询程序     */    public static void select() {        Connection conn = null;        PreparedStatement pstmt = null;        ResultSet rs = null;        // 获取连接并执行SQL        try {            conn = source.getConnection();            pstmt = conn.prepareStatement("select * from student where id = 906");            rs = pstmt.executeQuery();            while (rs.next()) {                System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));            }        } catch (Exception e) {            e.printStackTrace();        } finally {            // 释放资源            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }            try {                pstmt.close();            } catch (SQLException e) {                e.printStackTrace();            }            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

相关文章