小言_互联网的博客

JDBC数据连接池以及相关技术

382人阅读  评论(0)

前面的博客:https://blog.csdn.net/Marshallren/article/details/106874531

之前的案例中,每个类写好后都需要获取一个连接,而获取连接是获取资源的一个过程,非常耗时。你用完就释放,效率很低。好比你要吃饭,然后你拿来一双筷子,吃完了,你把筷子扔了。所以为了提高效率,我们引出了今天要说的内容:数据库连接池

 

数据库连接池

数据库连接池是一个容器(集合),用于存放数据库连接(Connection)。当系统初始化好后,创建一个容器,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完数据库后,不是将资源还给底层,而是还给容器,这样做的优点就算节约资源、用户访问的效率高

 

数据库连接池的实现

通过实现DataSource接口来完成

*DataSource接口:是Spring的一个接口,可以用来获取数据库的Connection(连接)

用到的方法:

Connection getConnection():获取连接

Connection.close():归还连接

*由数据库厂商来实现,不需要我们来实现

 

数据库连接池实现技术

1.C3P0

C3P0技术使用步骤:

1.导入驱动jar:mysql-connector-java-5.1.37-bin.jar

2.导入两个jar:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar

3.定义配置文件

        文件名称:c3p0.properties 或者 c3p0-config.xml

        路径:直接将文件放在src目录下即可

*c3p0-config.xml文件内配置了连接池的初始化连接数量、最大连接数量等

4.创建数据库连接池对象:数据库连接池对象 ComboPooledDataSource

5.获取连接getConnection();

 

E.G:


  
  1. package cn.itcast.datasource.c3p0;
  2. import com.mchange.v2.c3p0.ComboPooledDataSource;
  3. import javax.sql.DataSource;
  4. import java.sql.Connection;
  5. import java.sql.SQLException;
  6. /**
  7. * c3p0的演示
  8. */
  9. public class c3p0Demo1
  10. {
  11. public static void main(String[] args) throws SQLException {
  12. //1.创建数据库连接池对象
  13. DataSource ds = new ComboPooledDataSource();
  14. //2.获取连接对象
  15. Connection conn = ds.getConnection();
  16. //3.打印
  17. System.out.println(conn);
  18. }
  19. }

结果:可以看到此时已经获得了连接对象

*注意:红色的内容不是错误信息,而是日志。一定要慢慢学会看日志内容!

 

2.Druid

Druid使用步骤:

1.导入驱动jar:druid-1.0.9.jar

2.定义配置文件

        路径:直接将文件放在src目录下即可(理论上可以放在任意目录下,不过和C3P0相比,Druid多了一个加载配置文件的过程)

3.加载配置文件


  
  1. Properties pro = new Properties();
  2. InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream( "druid.properties");
  3. pro.load(is);

4.获取数据库连接池对象:通过工厂类获取,DruidDataSourceFactory()

5.获取连接getConnection();

 

E.G:


  
  1. package cn.itcast.datasource.druid;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import javax.sql.DataSource;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.sql.Connection;
  7. import java.util.Properties;
  8. public class DruidDemo1 {
  9. public static void main(String[] args) throws Exception {
  10. //1.加载配置文件
  11. Properties pro = new Properties();
  12. InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream( "druid.properties");
  13. pro.load(is);
  14. //2.获取连接池对象
  15. DataSource ds = DruidDataSourceFactory.createDataSource(pro);
  16. //3.获取连接
  17. Connection conn = ds.getConnection();
  18. //4.打印结果
  19. System.out.println(conn);
  20. }
  21. }

结果:

 

Druid配合工具类来完成实例

上述的工作只是如何通过数据连接池获取连接,而如果在实际操作中每进行一次连接操作就要创建新对象,实在是太麻烦了,而且也不专业,小心日后被专业团队给抬走了(黑人抬棺),所以我们需要创建一个工具类来减少冗余,提高复用性

1.建立一个util包,内部创建一个jdbcUtils类


  
  1. package cn.itcast.datasource.utils;
  2. import cn.itcast.datasource.druid.DruidDemo1;
  3. import com.alibaba.druid.pool.DruidDataSourceFactory;
  4. import com.sun.xml.internal.bind.v2.model.core.PropertyInfo;
  5. import javax.sql.DataSource;
  6. import java.io.IOException;
  7. import java.sql.Connection;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import java.sql.Statement;
  11. import java.util.Properties;
  12. public class JDBCUtils {
  13. //1.定义成员变量DataSource
  14. private static DataSource ds;
  15. /**
  16. *配置文件的读取,只需要读取一次即可。使用静态代码块
  17. */
  18. static {
  19. try {
  20. //1.加载配置文件
  21. Properties pro = new Properties();
  22. pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream( "druid.properties"));
  23. //2.获取连接池对象
  24. ds = DruidDataSourceFactory.createDataSource(pro);
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. /**
  32. *获取连接
  33. */
  34. public static Connection getConnection() throws SQLException {
  35. return ds.getConnection();
  36. }
  37. /**
  38. *归还连接
  39. */
  40. public static void close(Statement stmt, Connection conn) {
  41. close( null, stmt, conn); //减少代码量
  42. }
  43. /**
  44. *归还连接重载
  45. */
  46. public static void close(ResultSet rs, Statement stmt, Connection conn) {
  47. if (rs != null) {
  48. try {
  49. rs.close(); //归还连接
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. if (stmt != null) {
  55. try {
  56. stmt.close(); //归还连接
  57. } catch (SQLException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. if (conn != null) {
  62. try {
  63. conn.close(); //归还连接
  64. } catch (SQLException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. }
  69. /**
  70. *获取连接池方法(本例子用不到,先写这儿)
  71. */
  72. public static DataSource getDataSource(){
  73. return ds;
  74. }
  75. }

2.main函数


  
  1. package cn.itcast.datasource.druid;
  2. import cn.itcast.datasource.utils.JDBCUtils;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. public class DruidDemo2 {
  7. public static void main (String[] args) {
  8. //0.抽取变量,复用
  9. Connection conn = null;
  10. PreparedStatement pstmt = null;
  11. try {
  12. //1.获取连接
  13. conn = JDBCUtils.getConnection();
  14. //2.定义sql
  15. String sql = "insert into account values(null, ?, ?)";
  16. //3.获取pstmt对象
  17. pstmt = conn.prepareStatement(sql);
  18. //4.给?赋值
  19. pstmt.setString( 1, "王五");
  20. pstmt.setDouble( 2, 3000);
  21. //5.执行sql
  22. int count = pstmt.executeUpdate();
  23. System.out.println(count);
  24. } catch (SQLExceptione) {
  25. e.printStackTrace();
  26. } finally {
  27. //6.归还资源
  28. JDBCUtils.close(pstmt, conn);
  29. }
  30. }
  31. }

 


转载:https://blog.csdn.net/Marshallren/article/details/106888346
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场