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

互联网 19-11-26

传统方式和连接池方式

传统方式的步骤

使用传统方式在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操作数据库——使用连接池连接数据库的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 连接池
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:linux上怎么设置phpmyadmin?

相关资讯