数据库连接池是做什么的呢?实现原理?简单实例?存在问题以及解决方案。还有那些问题没有解决?
一、介绍
数据库连接池是一个用于管理和提供数据库连接的软件组件。
好处:1.节省资源
2.提高效率
3.控制连接数,解决并发问题。
二、实现原理:
在应用程序和mysql数据库之间创建一个数据库连接池,将mysql中的数据库比如(db_news2019)预存到数据库连接池中,应用程序通过数据库连接池来获取连接或者关闭连接。此时就会出现两个疑惑。第一,将mysql中的数据库如何预存到数据连接池中?这个应该是druid的内部原理,目前来说不知道。第二,mysql中的数据库预存到数据库连接池中不会浪费大量资源吗?因此需要了解druid.properties中的配置信息。设置一个合理的连接数和连接存在时间。
三 、用例
删除数据库db_news2019中的一条信息
druid.properites的配置信息(位置在src/main/resource)-------------------------------------------------------------- url=jdbc:mysql://localhost:3306/db_news2019 username=root password=123456 driverClassName=com.mysql.cj.jdbc.Driver initialSize=10 maxActive=10
JDBCUtils(工具类--来实现数据库连接池技术)-------------------------------------------------package till; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class JDBCUtils { // 1.定义成员变量 private static DataSource source; static{ try { // 1.创建properties Properties pros = new Properties(); //2.加载输入流 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties"); // 3.加载到配置文件对象中去 pros.load(is); // 配置数据源 DruidDataSourceFactory.createDataSource(pros); source = DruidDataSourceFactory.createDataSource(pros); } catch (Exception e) { e.printStackTrace(); } } /* *获取连接 */ public static Connection getConnection() throws SQLException { return source.getConnection(); } /** * 释放连接 */ public static void close(ResultSet rs, PreparedStatement ps, Connection conn) { try { if (rs != null){ rs.close(); } if (ps!=null){ ps.close(); } if (conn != null){ conn.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); } } /** * 获取连接池的方法 */ public static DataSource getDataSource(){ return source; } } test(测试用例)--------------------------------------------------------------------------
package test; import till.JDBCUtils; import java.sql.*; public class test1 { public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); String sql = "delete from t_user where uid = ?"; ps = conn.prepareStatement(sql); ps.setObject(1,"U10022"); ps.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } 运行结果:
四.存在问题以及解决方案
1.关于druid数据库连接池的实现代码有很多,但你的版本不一定都适用,
2.在导入druid.jre包的时候别忘了导入mysql-connector-j-8.0.31
3.关于配置信息要注意,
4.druid.properties的位置要放在src/main/resource中。当然不同的方法位置可能不同。
五、问题
在思考之后,才发现最大连接数指的是能有多少个用户同时使用连接,还以为是数据库能连多少个。此时问题就出来了,如何实现多个数据库的数据池。
如果有大佬的话,请帮忙解决一下,谢谢。