- 建立数据库连接的两种方式:
- 1.传统连接方式:
- 2.连接池方式:
- 传统方式存在问题:
- 连接池的优势
- 实现一个连接池:
- 1.创建配置文件
- 2.创建PropertiesUtil工具类
- 3.创建一个连接池
- 4.baseDao实现:
首先调用Class.forName()方法加载数据库驱动,然后调用DriverManager.getConnection()方法建立连接
2.连接池方式:连接池解决方案是在应用程序启动时就预先建立多个数据库连接对象,然后将连接对象保存到连接池中。当客户请求到来时,从池中取出一个连接对象为客户服务。当请求完成时,客户程序调用close()方法,将连接对象放回池中.对于多于连接池中连接数的请求,排队等待。应用程序还可根据连接池中连接的使用率,动态增加或减少池中的连接数。
传统方式存在问题:Connection对象在每次执行DML和DQL的过程中都要创建一次,DML和DQL执行完毕后,connection对象都会被销毁. connection对象是可以反复使用的,没有必要每次都创建新的.该对象的创建和销毁都是比较消耗系统资源的,如何实现connection对象的反复使用呢?使用连接池技术实现.
连接池的优势1.预先准备一些链接对象,放入连接池中,当多个线程并发执行时,可以避免短时间内一次性大量创建链接对象,减少计算机单位时间内的运算压力,提高程序的响应速度
2.实现链接对象的反复使用,可以大大减少链接对象的创建次数,减少资源的消耗,具体实现如下:
准备jdbc.properties配置文件,放在src下
## key=value driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true user=root password=root initSize=1 maxSize=12.创建PropertiesUtil工具类
import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertiesUtil { private Properties properties; public PropertiesUtil(String path){ properties=new Properties(); InputStream inputStream = this.getClass().getResourceAsStream(path); try { properties.load(inputStream); } catch (IOException e) { e.printStackTrace(); } } public String getProperties(String key){ return properties.getProperty(key); } }3.创建一个连接池
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.linkedList; public class MyConnectionPool { private static String driver; private static String url; private static String user; private static String password; private static int initSize; private static int maxSize; private static linkedListpool; static{ // 初始化参数 PropertiesUtil propertiesUtil=new PropertiesUtil("/jdbc.properties"); driver=propertiesUtil.getProperties("driver"); url=propertiesUtil.getProperties("url"); user=propertiesUtil.getProperties("user"); password=propertiesUtil.getProperties("password"); initSize=Integer.parseInt(propertiesUtil.getProperties("initSize")); maxSize=Integer.parseInt(propertiesUtil.getProperties("maxSize")); // 加载驱动 try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 初始化pool pool=new linkedList (); // 创建5个链接对象 for (int i = 0; i 0){ connection= pool.removeFirst();// 移除集合中的第一个元素 System.out.println("连接池中还有连接:"+connection.hashCode()); }else{ connection = initConnection(); System.out.println("连接池空,创建新连接:"+connection.hashCode()); } return connection; } // 共有的向连接池归还连接对象的方法 public static void returnConnection(Connection connection){ if(null != connection){ try { if(!connection.isClosed()){ if(pool.size() 4.baseDao实现: import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List; public abstract class baseDao { public int baseUpdate(String sql,Object ... args){ // 向 Emp表中增加一条数据 Connection connection = null; PreparedStatement preparedStatement=null; int rows=0; try{ connection = MyConnectionPool.getConnection(); preparedStatement = connection.prepareStatement(sql); //设置参数 for (int i = 0; i欢迎分享,转载请注明来源:内存溢出
评论列表(0条)