• 技术文章 >Java >Java基础

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

    angryTomangryTom2019-11-26 15:43:13转载912

    传统方式和连接池方式

    传统方式的步骤

    使用传统方式在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/demo
    username=root
    password=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();
                }
            }
        }
    }

    以上就是Java操作数据库——使用连接池连接数据库的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:java 连接池
    上一篇:java中如何实现数组的冒泡排序 下一篇:Java中的“浅复制”与“深复制”的区别与实现(附代码)
    大前端线上培训班

    相关文章推荐

    • PHP连接池详解• php实现mysql连接池的效果• MySQL数据库连接池SMProxy• php有数据库连接池吗

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网